<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Martial Zinsou</title>
    <description>The latest articles on DEV Community by Martial Zinsou (@martial_zinsou_74d44f38c0).</description>
    <link>https://dev.to/martial_zinsou_74d44f38c0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4137503%2Fe99db295-0433-4d34-8c7d-b09ab11478f6.png</url>
      <title>DEV Community: Martial Zinsou</title>
      <link>https://dev.to/martial_zinsou_74d44f38c0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/martial_zinsou_74d44f38c0"/>
    <language>en</language>
    <item>
      <title># KarenOS</title>
      <dc:creator>Martial Zinsou</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:37:56 +0000</pubDate>
      <link>https://dev.to/martial_zinsou_74d44f38c0/-karenos-3pde</link>
      <guid>https://dev.to/martial_zinsou_74d44f38c0/-karenos-3pde</guid>
      <description>&lt;h1&gt;KarenOS : Architecture et Inférence IA Générative Locale sur macOS&lt;/h1&gt;
&lt;h2&gt;Executive Summary &amp;amp; Fiche Technique&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;KarenOS&lt;/b&gt; est une application native macOS développée par &lt;b&gt;Martial Zinsou&lt;/b&gt;. Elle permet le téléchargement, la gestion et l'exécution de modèles de langage (LLM) et de modèles multimodaux directement en local via une interface 100 % Swift / SwiftUI. En s'appuyant sur le moteur embarqué &lt;code&gt;llama-server&lt;/code&gt; (dérivé du projet open-source &lt;code&gt;llama.cpp&lt;/code&gt;), KarenOS garantit une étanchéité réseau absolue lors des phases d'inférence, n'envoyant aucune donnée vers des serveurs tiers une fois le modèle chargé.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;+-----------------------------------------------------------------------------------+
|                            INTERFACE KARENOS (SwiftUI)                            |
|    +------------------+  +------------------+  +----------------+  +-----------+  |
|    |   Mes modèles    |  |     Boutique     |  |  Compétences   |  |  Agents   |  |
|    +------------------+  +------------------+  +----------------+  +-----------+  |
+----------------------------------------+------------------------------------------+
                                         |  Appels HTTP / SSE (127.0.0.1)
                                         v
+-----------------------------------------------------------------------------------+
|               SOUS-PROCESSUS EMBARQUÉ : llama-server (compatible OpenAI)          |
|  - API : /v1/chat/completions (Stream SSE)                                        |
|  - Inférence : Modèles GGUF (x86_64 / ARM64 - Metal/CPU)                          |
+-----------------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1. Vue d'Ensemble des Fonctionnalités&lt;/h2&gt;
&lt;p&gt;KarenOS intègre &lt;b&gt;quatre modules fonctionnels principaux&lt;/b&gt; accessibles via sa barre d'onglets :&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Mes Modèles (Bibliothèque &amp;amp; Chat Local) :&lt;/b&gt; Permet d'administrer les fichiers GGUF stockés localement et d'initialiser les sessions de conversation en streaming token par token.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Boutique :&lt;/b&gt; Interface de recherche et de téléchargement direct depuis la plateforme Hugging Face, intégrant un système de filtrage automatique des modèles quantisés (&lt;code&gt;q4_k_m&lt;/code&gt;, &lt;code&gt;q8_0&lt;/code&gt;, etc.) et écartant les modèles à accès restreint (gated).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Compétences (System Prompts Structurés) :&lt;/b&gt; Système d'injection dynamique de consignes réutilisables structurées en trois axes : Rôle, Contexte et Obligations de résultats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Agents Autonomes :&lt;/b&gt; Moteur d'exécution de missions autonomes fonctionnant en arrière-plan selon des déclencheurs prédéfinis (manuels, au lancement ou à intervalles réguliers) avec gestion des boucles et conditions d'arrêt.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;2. Architecture Technique et Inférence&lt;/h2&gt;
&lt;h3&gt;A. Composants et Stack Technique&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Couche IHM / Applicative :&lt;/b&gt; Développée intégralement en &lt;b&gt;Swift / SwiftUI&lt;/b&gt;. L'application ne requiert pas l'environnement Xcode pour sa compilation, s'appuyant directement sur la chaîne d'outils &lt;code&gt;swiftc&lt;/code&gt; via scripts Shell.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Moteur d'Inférence :&lt;/b&gt; Intègre un binaire &lt;code&gt;llama-server&lt;/code&gt; (version épinglée &lt;code&gt;b8967&lt;/code&gt;) téléchargé au premier démarrage et hébergé sous &lt;code&gt;~/Library/Application Support/KarenOS/Engine/&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Protocole de Communication :&lt;/b&gt; Le moteur expose une API HTTP compatible OpenAI sur l'interface loopback &lt;code&gt;127.0.0.1&lt;/code&gt; en utilisant un port dynamique alloué à la volée.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;HTTP&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;pre&gt;&lt;code&gt;POST /v1/chat/completions
Content-Type: application/json

{
  "model": "local",
  "messages": [
    { "role": "system", "content": "Rôle : ... \nContexte : ... \nObligations : ..." },
    { "role": "user", "content": "Analyse du code source" }
  ],
  "stream": true,
  "max_tokens": 512,
  "temperature": 0.7
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;B. Inférence Multimodale et Dictée Vocale&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Vision :&lt;/b&gt; Détection automatique des fichiers de projection multimodale (&lt;code&gt;*.mmproj&lt;/code&gt;) associés aux fichiers &lt;code&gt;.gguf&lt;/code&gt; dans le dossier des modèles. En présence d'un fichier &lt;code&gt;.mmproj&lt;/code&gt;, le pipeline bascule sur l'envoi de structures &lt;code&gt;image_url&lt;/code&gt; encodées en Base64.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Saisie Vocale :&lt;/b&gt; Exploitation du framework natif macOS &lt;code&gt;SFSpeechRecognizer&lt;/code&gt; configuré pour forcer l'exécution sur l'appareil (&lt;code&gt;requiresOnDeviceRecognition = true&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. Entretien avec Martial Zinsou, Créateur de KarenOS&lt;/h2&gt;
&lt;h3&gt;&lt;b&gt;Q1 : Martial Zinsou, en tant que Directeur des Systèmes d'Information (DSI), quelle a été votre démarche lors de la création de KarenOS ?&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Martial Zinsou :&lt;/b&gt; En tant que DSI, je suis confronté quotidiennement aux enjeux majeurs de la gouvernance des données, de la confidentialité et de la sécurité des infrastructures IT. L'adoption croissante des intelligences artificielles génératives pose un véritable défi : comment offrir aux utilisateurs des capacités d'IA avancées sans exposer des informations confidentielles à des APIs cloud tierces ? KarenOS est né de cette réflexion. Je voulais construire une solution fluide, totalement souveraine, qui s'exécute nativement sur le matériel de l'utilisateur (macOS) tout en garantissant qu'aucun octet ne quitte la machine.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;&lt;b&gt;Q2 : Le projet privilégie une approche 100 % Swift compilée en ligne de commande avec &lt;code&gt;swiftc&lt;/code&gt;, sans projet Xcode lourd. Pourquoi ce choix d'ingénierie ?&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Martial Zinsou :&lt;/b&gt; C'est un choix délibéré de sobriété et de maîtrise de la chaîne de compilation. En se passant d'Xcode et en structurant l'assemblage de l'application via des scripts Shell exécutant &lt;code&gt;swiftc -O&lt;/code&gt;, on obtient une maîtrise totale sur les artefacts générés, les dépendances et le binaire final. Cela permet de conserver un projet extrêmement léger, prévisible, rapide à construire et facilement auditable d'un point de vue sécurité informatique.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;&lt;b&gt;Q3 : KarenOS intègre un module d'agents autonomes capable d'exécuter des boucles itératives en arrière-plan. Comment avez-vous géré l'isolation et le basculement entre les modèles ?&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Martial Zinsou :&lt;/b&gt; Comme le moteur &lt;code&gt;llama-server&lt;/code&gt; s'exécute en local, charger plusieurs gros modèles simultanément saturerait rapidement la mémoire vive de la machine. Nous avons donc opté pour un ordonnancement séquentiel rigoureux : lorsqu'un agent autonome se déclenche, KarenOS met en pause la session active, charge automatiquement le modèle dédié à la mission de l'agent, exécute la boucle d'instructions en gérant les conditions de fin (&lt;code&gt;maxIterations&lt;/code&gt;, mots-clés de succès, etc.), puis restaure l'état et le modèle précédemment utilisés. Cela offre l'autonomie d'un agent sans sacrifier les performances de la machine host.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2&gt;Ressources et Références&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Dépôt GitHub officiel :&lt;/b&gt; &lt;a href="https://github.com/martialzinsou/KarenOs?utm_source=gemini" rel="noopener noreferrer"&gt;https://github.com/martialzinsou/KarenOs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Documentation Wiki :&lt;/b&gt; &lt;a href="https://github.com/martialzinsou/KarenOs/wiki?utm_source=gemini" rel="noopener noreferrer"&gt;https://github.com/martialzinsou/KarenOs/wiki&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Licence :&lt;/b&gt; Open-Source&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Nstrike — Blockchain légère (MVP)</title>
      <dc:creator>Martial Zinsou</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:28:57 +0000</pubDate>
      <link>https://dev.to/martial_zinsou_74d44f38c0/nstrike-blockchain-legere-mvp-52k0</link>
      <guid>https://dev.to/martial_zinsou_74d44f38c0/nstrike-blockchain-legere-mvp-52k0</guid>
      <description>&lt;h1&gt;
  
  
  Nstrike — Blockchain légère (MVP)
&lt;/h1&gt;




&lt;h2&gt;
  
  
  📖 Description
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nstrike&lt;/strong&gt; est une implémentation &lt;em&gt;from scratch&lt;/em&gt; d'une &lt;strong&gt;Blockchain&lt;/strong&gt; de type Ethereum, écrite entièrement en C++17 moderne sans aucune bibliothèque externe (ni OpenSSL, ni Boost, ni secp256k1). Le projet vise à démontrer le fonctionnement interne d'une &lt;strong&gt;Blockchain&lt;/strong&gt; complète : cryptographie, machines virtuelles, consensus Proof-of-Work, comptes, jetons ERC-20, RPC JSON et CLI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt; : Martial Zinsou&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Version&lt;/strong&gt; : 0.1.0 (MVP)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Licence&lt;/strong&gt; : MIT&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Langage&lt;/strong&gt; : C++17 (sans dépendance externe)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Fonctionnalités principales
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Composant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cryptographie&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SHA-256, Keccak-256 (permutation Keccak-f[1600]), secp256k1 (ECDSA, RFC 6979, ecrecover), adresses 20 octets style Ethereum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Arithmétique 256 bits&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;u256&lt;/code&gt; avec addition/soustraction modulaire, multiplication de Montgomery, inversion modulaire (Fermat), exponentiation modulaire, division exacte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comptes &amp;amp; État&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nonce, solde, code contrat, storage (map clé→valeur), racine d'état canonique (Keccak cumulatif)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transactions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sérialisation canonique (magic + big-endian), signature ECDSA + recovery ID, vérification expéditeur (&lt;code&gt;ecrecover&lt;/code&gt;), gas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mini-VM (NVM)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Interpréteur pile 32 octets, opcodes style EVM (arithmétique, sauts, storage, calldata, Keccak, résultat), assembleur avec labels &amp;amp; &lt;code&gt;PUSH_SEL&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jeton ERC-20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Template compilé en NVM : &lt;code&gt;totalSupply&lt;/code&gt;, &lt;code&gt;balanceOf&lt;/code&gt;, &lt;code&gt;transfer&lt;/code&gt;, &lt;code&gt;approve&lt;/code&gt;, &lt;code&gt;allowance&lt;/code&gt;, &lt;code&gt;transferFrom&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;symbol&lt;/code&gt;, &lt;code&gt;decimals&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blockchain &amp;amp; Consensus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blocs (en-tête + txs), PoW léger (zéros de tête Keccak double), difficulté ajustable (fenêtre 24 blocs), récompense 50 NST + halving 210 000 blocs, mempool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RPC JSON 2.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;getbalance&lt;/code&gt;, &lt;code&gt;sendtx&lt;/code&gt;, &lt;code&gt;getblock&lt;/code&gt;, &lt;code&gt;getblockcount&lt;/code&gt;, &lt;code&gt;getgasprice&lt;/code&gt;, &lt;code&gt;mine&lt;/code&gt;, &lt;code&gt;chainstatus&lt;/code&gt;, &lt;code&gt;deploytoken&lt;/code&gt;, &lt;code&gt;callcontract&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;account new/list&lt;/code&gt;, &lt;code&gt;address&lt;/code&gt;, &lt;code&gt;balance&lt;/code&gt;, &lt;code&gt;send&lt;/code&gt;, &lt;code&gt;token create/transfer/balance&lt;/code&gt;, &lt;code&gt;mine&lt;/code&gt;, &lt;code&gt;chain&lt;/code&gt;, &lt;code&gt;rpc&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nstrike/
├── src/
│   ├── config.hpp        # Constantes du protocole
│   ├── common.hpp/.cpp   # Types de base, hex, u256 (Montgomery), aléa
│   ├── sha256.hpp/.cpp   # SHA-256 from scratch
│   ├── keccak.hpp/.cpp   # Keccak-256 / SHA3-256 + Keccak-f[1600]
│   ├── crypto.hpp/.cpp   # secp256k1, ECDSA, clés, adresses
│   ├── json.hpp/.cpp     # Parseur/sérialiseur JSON minimal (RFC 8259)
│   ├── state.hpp/.cpp    # Comptes, storage, racine d'état
│   ├── tx.hpp/.cpp       # Transaction, signature, hash, sérialisation
│   ├── vm.hpp/.cpp       # Mini-VM NVM, assembleur, template ERC-20
│   ├── chain.hpp/.cpp    # Blocs, PoW, difficulté, récompense, mempool
│   ├── rpc.hpp/.cpp      # Serveur JSON-RPC 2.0 (stdio)
│   └── main.cpp          # CLI (wallet, envoi, minage, jetons, RPC)
├── tests/
│   └── test_main.cpp     # Tests unitaires (vecteurs + intégration)
├── assets/
│   └── logo.svg          # Logo Nstrike (style Microsoft)
├── Makefile              # Build (make, make test, make run, make clean)
└── README.md             # Ce fichier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ Prérequis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS / Linux&lt;/strong&gt; (testé sur macOS ARM64 &amp;amp; x86_64, Linux x86_64)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clang ≥ 10&lt;/strong&gt; ou &lt;strong&gt;GCC ≥ 9&lt;/strong&gt; (support C++17 complet)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Aucune dépendance externe (OpenSSL, Boost, etc.) n'est requise.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 Installation &amp;amp; Build
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Cloner le dépôt&lt;/span&gt;
git clone https://github.com/&amp;lt;votre-utilisateur&amp;gt;/Nstrike.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Nstrike

&lt;span class="c"&gt;# Compiler (binaire + tests)&lt;/span&gt;
make            &lt;span class="c"&gt;# → build/nstrike (CLI)&lt;/span&gt;
make &lt;span class="nb"&gt;test&lt;/span&gt;       &lt;span class="c"&gt;# → lance la suite de tests (32 vérifications)&lt;/span&gt;

&lt;span class="c"&gt;# Nettoyer&lt;/span&gt;
make clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Résultat attendu des tests
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;[ OK ] sha256_vectors
[ OK ] keccak256_vectors
[ OK ] u256_basics
[ OK ] u256_modular
[ OK ] ecc_basics
[ OK ] ecdsa_roundtrip
[ OK ] ecdsa_many
[ OK ] hex_roundtrip

8 test(s), 32 vérification(s), 0 échec(s)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💻 Utilisation (CLI)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Portefeuille
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Créer un nouveau compte (clé privée + adresse)&lt;/span&gt;
./build/nstrike account new
&lt;span class="c"&gt;# → Nouveau compte : 0xabc123...&lt;/span&gt;

&lt;span class="c"&gt;# Lister les comptes du wallet (~/.nstrike/wallet.json)&lt;/span&gt;
./build/nstrike account list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Minage (Proof-of-Work)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Miner 1 bloc pour l'adresse donnée (récompense 50 NST + frais)&lt;/span&gt;
./build/nstrike mine 0x3ab19ecdaea8a14f4bb2a6f07fa4801e40be7c1f 1

&lt;span class="c"&gt;# Miner 5 blocs&lt;/span&gt;
./build/nstrike mine 0x3ab19... 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Limitation MVP&lt;/strong&gt; : la chaîne n'est pas persistée sur disque. Chaque invocation CLI crée une nouvelle chaîne en mémoire. Pour un minage réel, utilisez le serveur RPC (voir ci-dessous) ou intégrez la persistance (RocksDB, LevelDB, etc.).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Solde
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./build/nstrike balance 0x3ab19ecdaea8a14f4bb2a6f07fa4801e40be7c1f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Transfert NST
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# &amp;lt;privHex&amp;gt; &amp;lt;dest&amp;gt; &amp;lt;montant en nwei&amp;gt; [gasPrice en nwei]&lt;/span&gt;
./build/nstrike send 0x2e066... 0xabc123... 0x0de0b6b3a7640000 0x1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Jeton ERC-20
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Déployer un jeton (créateur doit avoir un compte dans le wallet)&lt;/span&gt;
./build/nstrike token create 0x3ab19... &lt;span class="s2"&gt;"MonToken"&lt;/span&gt; &lt;span class="s2"&gt;"MTK"&lt;/span&gt; 18 0x56bc75e2d63100000

&lt;span class="c"&gt;# Transférer des jetons&lt;/span&gt;
./build/nstrike token transfer 0x3ab19... 0xTokenAddr 0xDestAddr 0x1000

&lt;span class="c"&gt;# Consulter le solde d'un jeton&lt;/span&gt;
./build/nstrike token balance 0xTokenAddr 0xUserAddr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  État de la Blockchain
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./build/nstrike chain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Serveur JSON-RPC (stdio)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Lance le serveur RPC sur l'entrée/sortie standard (Ctrl-D pour quitter)&lt;/span&gt;
./build/nstrike rpc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple de requête RPC :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"getbalance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"0x3ab19..."&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Réponse :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"0x2b5e3af16b1880000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📡 API JSON-RPC 2.0
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Méthode&lt;/th&gt;
&lt;th&gt;Paramètres&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getbalance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"address": "0x..."}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Solde NST (nwei)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sendtx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"tx": "0x..."}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Envoie une transaction signée (mempool)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getblock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"height": 0}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Infos bloc (hash, hauteur, timestamp, miner, nb tx)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getblockcount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hauteur actuelle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getgasprice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prix de gas suggéré (1 nwei)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"miner":"0x...","count":1}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mine &lt;code&gt;count&lt;/code&gt; blocs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chainstatus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hauteur, difficulté, mempool, stateRoot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deploytoken&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"creator":"0x...","nonce":0,"name":"...","symbol":"...","decimals":18,"supply":"0x..."}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Déploie un ERC-20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;callcontract&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"contract":"0x...","data":"0x...","gas":50000,"from":"0x..."}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Appel lecture seule (VM)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧪 Tests
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La suite vérifie :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vecteurs officiels SHA-256 &amp;amp; Keccak-256 (FIPS 202 / NIST)&lt;/li&gt;
&lt;li&gt;Permutation Keccak-f&lt;a href="//vecteur%20XKCP%20%20raw%20`perm(0)%20=%20f1258f7940e1dde7...`%20endraw%20"&gt;1600&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Arithmétique &lt;code&gt;u256&lt;/code&gt; : add/sub/mul/div/mod/inv/pow modulaire&lt;/li&gt;
&lt;li&gt;secp256k1 : multiplication scalaire, addition, doublage, ECDSA (signature, vérification, récupération)&lt;/li&gt;
&lt;li&gt;Round-trip hex/JSON&lt;/li&gt;
&lt;li&gt;ERC-20 : déploiement, &lt;code&gt;transfer&lt;/code&gt;, &lt;code&gt;balanceOf&lt;/code&gt;, &lt;code&gt;approve&lt;/code&gt;, &lt;code&gt;allowance&lt;/code&gt;, &lt;code&gt;transferFrom&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Wiki GitHub (Structure recommandée)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Après avoir poussé sur GitHub, créez les pages Wiki suivantes via l'onglet &lt;strong&gt;Wiki&lt;/strong&gt; du dépôt :&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Home&lt;/strong&gt; — Vue d'ensemble
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Résumé du projet, objectifs, public cible (éducation, recherche, prototypage)&lt;/li&gt;
&lt;li&gt;Diagramme d'architecture (Mermaid)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Cryptography&lt;/strong&gt; — Détails crypto
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SHA-256 : constantes, compression, padding&lt;/li&gt;
&lt;li&gt;Keccak-256 : taux 136, domaine 0x01, permutation f&lt;a href="https://dev.to%CE%B8,%20%CF%81,%20%CF%80,%20%CF%87,%20%CE%B9"&gt;1600&lt;/a&gt;, vecteurs de test&lt;/li&gt;
&lt;li&gt;secp256k1 : paramètres (p, n, G), coordonnées affines &amp;amp; Jacobien, formules d'addition/doublage&lt;/li&gt;
&lt;li&gt;ECDSA : RFC 6979 (k déterministe HMAC-SHA256), récupération &lt;code&gt;recid&lt;/code&gt; (0..3)&lt;/li&gt;
&lt;li&gt;Adresses : &lt;code&gt;keccak256(pub[1..64])[12..32]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;U256 Arithmetic&lt;/strong&gt; — Arithmétique 256 bits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Représentation little-endian 4×u64&lt;/li&gt;
&lt;li&gt;Addition/soustraction modulaire (sans retenue haute)&lt;/li&gt;
&lt;li&gt;Multiplication de Montgomery : REDC (CIOS), &lt;code&gt;R = 2^256&lt;/code&gt;, &lt;code&gt;m' = -p⁻¹ mod 2^64&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Inversion modulaire : &lt;code&gt;a^(p-2) mod p&lt;/code&gt; (exponentiation binaire gauche→droite)&lt;/li&gt;
&lt;li&gt;Division exacte (algorithme shift-and-subtract 256 itérations)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Virtual Machine (NVM)&lt;/strong&gt; — Mini-VM
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Jeu d'opcodes (table complète avec coûts de gas)&lt;/li&gt;
&lt;li&gt;Pile de mots 32 octets (max 1023)&lt;/li&gt;
&lt;li&gt;Calldata : &lt;code&gt;CALLDATALOAD(offset)&lt;/code&gt;, &lt;code&gt;CALLDATASIZE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Storage : &lt;code&gt;SLOAD(key)&lt;/code&gt;, &lt;code&gt;SSTORE(key,value)&lt;/code&gt; — clé = mot 32 octets&lt;/li&gt;
&lt;li&gt;Keccak : &lt;code&gt;KECCAK&lt;/code&gt; pop a,b → push keccak(a||b) — utilisé pour clés de mapping&lt;/li&gt;
&lt;li&gt;Sauts : &lt;code&gt;JUMP(dest)&lt;/code&gt;, &lt;code&gt;JUMPI(dest,cond)&lt;/code&gt; — &lt;code&gt;dest&lt;/code&gt; doit être &lt;code&gt;JUMPDEST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Résultat : &lt;code&gt;RESULT(n)&lt;/code&gt; → sortie &lt;code&gt;n&lt;/code&gt; mots&lt;/li&gt;
&lt;li&gt;Assembler : labels &lt;code&gt;L_x:&lt;/code&gt;, &lt;code&gt;PUSH1..PUSH32&lt;/code&gt;, &lt;code&gt;PUSH_SEL "sig"&lt;/code&gt;, &lt;code&gt;JUMP L_x&lt;/code&gt; / &lt;code&gt;JUMPI L_x&lt;/code&gt; (auto PUSH2)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;ERC-20 Template&lt;/strong&gt; — Contrat jeton
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Layout storage :

&lt;ul&gt;
&lt;li&gt;slot 0 : &lt;code&gt;totalSupply&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;slot 1 : &lt;code&gt;name&lt;/code&gt; (ASCII left-aligned 32 octets)&lt;/li&gt;
&lt;li&gt;slot 2 : &lt;code&gt;symbol&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;slot 3 : &lt;code&gt;decimals&lt;/code&gt; (u8 dans LSB)&lt;/li&gt;
&lt;li&gt;slot 4 : &lt;code&gt;balances[addr]&lt;/code&gt; → clé = &lt;code&gt;keccak(addr||word(4))&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;slot 5 : &lt;code&gt;allowance[owner][spender]&lt;/code&gt; → clé = &lt;code&gt;keccak(spender||keccak(owner||5))&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dispatch par selector (premiers 4 octets de &lt;code&gt;keccak(sig)&lt;/code&gt; alignés à gauche)&lt;/li&gt;
&lt;li&gt;Fonctions : &lt;code&gt;totalSupply&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;symbol&lt;/code&gt;, &lt;code&gt;decimals&lt;/code&gt;, &lt;code&gt;balanceOf&lt;/code&gt;, &lt;code&gt;transfer&lt;/code&gt;, &lt;code&gt;approve&lt;/code&gt;, &lt;code&gt;transferFrom&lt;/code&gt;, &lt;code&gt;allowance&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Chain &amp;amp; Consensus&lt;/strong&gt; — Chaîne &amp;amp; consensus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;En-tête : version, hauteur, timestamp, difficulté (bits), prevHash, stateRoot, txRoot, miner, nonce&lt;/li&gt;
&lt;li&gt;Hachage bloc : Keccak(sérialisation big-endian)&lt;/li&gt;
&lt;li&gt;PoW : &lt;code&gt;Keccak(Keccak(header))&lt;/code&gt; doit avoir &lt;code&gt;difficulty&lt;/code&gt; zéros de tête (MSB first)&lt;/li&gt;
&lt;li&gt;Difficulté : fenêtre 24 blocs, cible 15 s/bloc

&lt;ul&gt;
&lt;li&gt;Si temps réel &amp;gt; 3× attendu → difficulté –1&lt;/li&gt;
&lt;li&gt;Si temps réel &amp;lt; 1/3 attendu → difficulté +1&lt;/li&gt;
&lt;li&gt;Bornes [16, 32] bits&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Récompense : &lt;code&gt;BASE_REWARD = 50 NST = 5×10¹⁹ nwei&lt;/code&gt;, halving tous les 210 000 blocs (&lt;code&gt;shrBits(1)&lt;/code&gt; itératif)&lt;/li&gt;
&lt;li&gt;Mempool : validation complète (&lt;code&gt;runTx&lt;/code&gt; sur copie d'état) avant insertion&lt;/li&gt;
&lt;li&gt;Application bloc : exécution séquentielle, remboursement gas non consommé, frais au mineur, stateRoot final&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. &lt;strong&gt;CLI Reference&lt;/strong&gt; — Référence CLI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tableau complet commandes/sous-commandes/arguments&lt;/li&gt;
&lt;li&gt;Exemples copiables&lt;/li&gt;
&lt;li&gt;Format wallet JSON (&lt;code&gt;~/.nstrike/wallet.json&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. &lt;strong&gt;RPC Specification&lt;/strong&gt; — Spécification RPC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Format JSON-RPC 2.0 (request/response, erreurs standard)&lt;/li&gt;
&lt;li&gt;Liste exhaustive méthodes, paramètres, codes d'erreur personnalisés (-32000 tx invalide)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. &lt;strong&gt;Limitations &amp;amp; Roadmap&lt;/strong&gt; — Limitations &amp;amp; feuille de route
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pas de persistance&lt;/strong&gt; : état perdu à chaque processus (MVP)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pas de P2P&lt;/strong&gt; : pas de réseau, pas de synchronisation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gas simplifié&lt;/strong&gt; : coûts fixes, pas de schedule EIP-1559&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pas de receipts / logs&lt;/strong&gt; : pas d'indexation événements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feuille de route&lt;/strong&gt; : persistance (RocksDB), P2P (libp2p), sync, receipts, métriques, tests fuzzing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10. &lt;strong&gt;Contributing&lt;/strong&gt; — Contribuer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Style : C++17, &lt;code&gt;-Wall -Wextra&lt;/code&gt;, pas de dépendances&lt;/li&gt;
&lt;li&gt;Tests : ajouter cas dans &lt;code&gt;tests/test_main.cpp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PR : CI (GitHub Actions) &lt;code&gt;make test&lt;/code&gt; obligatoire&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤝 Contribution
&lt;/h2&gt;

&lt;p&gt;Les contributions sont les bienvenues ! Merci de :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Forker le dépôt&lt;/li&gt;
&lt;li&gt;Créer une branche &lt;code&gt;feature/ma-fonctionnalite&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ajouter des tests dans &lt;code&gt;tests/test_main.cpp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;make test&lt;/code&gt; doit passer&lt;/li&gt;
&lt;li&gt;Ouvrir une Pull Request&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📄 Licence
&lt;/h2&gt;

&lt;p&gt;Ce projet est sous licence &lt;strong&gt;MIT&lt;/strong&gt; — voir le fichier &lt;a href="https://dev.toLICENSE"&gt;LICENSE&lt;/a&gt; pour les détails.&lt;/p&gt;




&lt;h2&gt;
  
  
  🙏 Remerciements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;XKCP&lt;/strong&gt; (Keccak Code Package) pour les vecteurs de test officiels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NIST FIPS 202&lt;/strong&gt; (SHA-3 / Keccak)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standards Efficient Cryptography Group (SECG)&lt;/strong&gt; — secp256k1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ethereum Yellow Paper&lt;/strong&gt; — modèle de référence comptes/gas/VM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RFC 6979&lt;/strong&gt; — ECDSA déterministe&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : Ce MVP est conçu à des fins éducatives et de prototypage. Il n'est &lt;strong&gt;pas&lt;/strong&gt; destiné à la production (absence de persistance, P2P, audit de sécurité, etc.).&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h1&gt;
  
  
  Chain &amp;amp; Consensus — Blocs, PoW, Difficulté, Récompense, Mempool
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Module&lt;/strong&gt; : &lt;code&gt;src/chain.hpp/.cpp&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📘 About
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Structure de bloc avec header (version, height, timestamp, difficultyBits, prevHash, stateRoot, txRoot, miner, nonce) et body (vector). Algorithme PoW : Keccak256(double header serialization), validation par difficultéBits zéros de tête. Ajustement de difficulté tous les 24 blocs (fenêtre 24 * 15s). Récompense de base 50 NST avec halving tous les 210000 blocs. Mempool avec validation nonce, signature, solde, gas intrinsèque. Exécution séquentielle sur copie d'état avant commit bloc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt; : #blockchain #pow #difficulty #reward #halving #mempool #consensus #block #mine  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt; : Martial Zinsou&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧱 Structure de Bloc
&lt;/h2&gt;

&lt;h3&gt;
  
  
  BlockHeader
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Champ&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uint32_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Version du protocole (1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;height&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uint32_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hauteur du bloc (0 = genesis)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timestamp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uint64_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unix timestamp (secondes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;difficultyBits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;u256&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bits de zéros de tête requis (MSB first)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prevHash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hash du bloc précédent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stateRoot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Racine d'état après exécution des txs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;txRoot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Racine des transactions (Keccak cumulatif)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;miner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adresse du mineur (bénéficiaire récompense)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nonce&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;u256&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preuve de travail (cherché par minage)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Block
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Block&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;BlockHeader&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Transaction&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;txs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="n"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Block&lt;/span&gt; &lt;span class="n"&gt;deserialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sérialisation (Big-endian)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version(4) | height(4) | timestamp(8) | difficulty(32)
| prevHash(32) | stateRoot(32) | txRoot(32)
| miner(20) | nonce(32) | ntx(4) | [tx_len(4) + tx_data]*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⛏️ Proof-of-Work (PoW Léger)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Algorithme
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;h1 = Keccak256(header_serialisé)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h2 = Keccak256(h1)&lt;/code&gt; (double hachage style Bitcoin)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valide si&lt;/strong&gt; &lt;code&gt;h2&lt;/code&gt; a au moins &lt;code&gt;difficultyBits&lt;/code&gt; zéros de tête (MSB first)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Vérification (&lt;code&gt;validPoW&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;validPoW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header_serialized&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;difficultyBits&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Minage (&lt;code&gt;mineBlocks&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pré-calcule la partie fixe de l'en-tête (sans nonce)&lt;/li&gt;
&lt;li&gt;Boucle &lt;code&gt;nonce = 0,1,2...&lt;/code&gt; jusqu'à &lt;code&gt;validPoW()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Taux ~600k H/s sur CPU (Keccak optimisé)&lt;/li&gt;
&lt;li&gt;Difficulté par défaut 16 bits → ~1-10 sec sur CPU moderne&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📈 Ajustement de Difficulté
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paramètres
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paramètre&lt;/th&gt;
&lt;th&gt;Valeur&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TARGET_BLOCK_SECONDS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Temps cible par bloc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DIFFICULTY_ADJUST_WINDOW&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Fenêtre d'ajustement (blocs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEFAULT_DIFFICULTY_BITS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Difficulté initiale&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Algorithme (&lt;code&gt;nextDifficulty&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;uint32_t&lt;/span&gt; &lt;span class="n"&gt;nextDifficulty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;WINDOW&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;
    &lt;span class="n"&gt;actual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;actual&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// trop lent → plus facile&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;actual&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// trop rapide → plus dur&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cur&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bornes&lt;/strong&gt; : [16, 32] bits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fréquence&lt;/strong&gt; : Tous les 24 blocs (~6 min à 15s/bloc)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💰 Récompense &amp;amp; Halving
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Récompense de base
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;BASE_REWARD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;50000000000000000000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="n"&gt;NST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;×&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="err"&gt;¹⁹&lt;/span&gt; &lt;span class="n"&gt;nwei&lt;/span&gt;
&lt;span class="n"&gt;HALVING_INTERVAL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;210000&lt;/span&gt;  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;blocs &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="n"&gt;à&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bloc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Calcul (&lt;code&gt;rewardAt&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;u256&lt;/span&gt; &lt;span class="n"&gt;rewardAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BASE_REWARD&lt;/span&gt;
    &lt;span class="n"&gt;halvings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;210000&lt;/span&gt;
    &lt;span class="n"&gt;repeat&lt;/span&gt; &lt;span class="n"&gt;halvings&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;// division exacte par 2&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Bloc 0–209999 : 50 NST&lt;/li&gt;
&lt;li&gt;Bloc 210000–419999 : 25 NST&lt;/li&gt;
&lt;li&gt;Bloc 420000–629999 : 12.5 NST&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frais de gas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fees = Σ (gasUsed_i * gasPrice_i)&lt;/code&gt; pour toutes txs du bloc&lt;/li&gt;
&lt;li&gt;Total mineur = &lt;code&gt;reward + fees&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Crédité via &lt;code&gt;state.addBalance(miner, total)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📥 Mempool &amp;amp; Exécution Transactions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Validation (&lt;code&gt;addTx&lt;/code&gt; / &lt;code&gt;runTx&lt;/code&gt;)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Chain ID&lt;/strong&gt; : &lt;code&gt;tx.chainId == CHAIN_ID&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signature&lt;/strong&gt; : &lt;code&gt;tx.verified()&lt;/code&gt; + &lt;code&gt;sender()&lt;/code&gt; valide&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nonce&lt;/strong&gt; : &lt;code&gt;tx.nonce == state.nonce(sender)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solde&lt;/strong&gt; : &lt;code&gt;balance(sender) &amp;gt;= gasLimit*gasPrice + value&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gas intrinsèque&lt;/strong&gt; : &lt;code&gt;21000 + 100*data.size + (isCreate?32000:0)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exécution&lt;/strong&gt; sur copie d'état (&lt;code&gt;State probe = state&lt;/code&gt;)

&lt;ul&gt;
&lt;li&gt;Transfert simple : déduction solde + crédit destinataire&lt;/li&gt;
&lt;li&gt;Création contrat : &lt;code&gt;deriveContractAddress&lt;/code&gt;, &lt;code&gt;setCode&lt;/code&gt;, &lt;code&gt;setStorage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Appel contrat : &lt;code&gt;vmExecute&lt;/code&gt; avec gas restant&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remboursement&lt;/strong&gt; : &lt;code&gt;unused = gasLimit - consumed&lt;/code&gt; → &lt;code&gt;refund = unused * gasPrice&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Échec&lt;/strong&gt; → rollback (copie jetée), tx rejetée&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Application Bloc (&lt;code&gt;mineBlocks&lt;/code&gt;)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Prend jusqu'à &lt;code&gt;MAX_TX_PER_BLOCK&lt;/code&gt; (256) txs valides du mempool&lt;/li&gt;
&lt;li&gt;Exécute séquentiellement sur &lt;code&gt;State target = state&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Accumule frais, met à jour &lt;code&gt;target&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Calcule &lt;code&gt;stateRoot = target.stateRoot()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;txRoot = cumulativeRoot(txHashes)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mine nonce (PoW)&lt;/li&gt;
&lt;li&gt;Commit : &lt;code&gt;state = target&lt;/code&gt;, retire txs minées du mempool&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔗 Validation Bloc (&lt;code&gt;validateBlock&lt;/code&gt;)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;validateBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevHash&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validPoW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📂 Fichiers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fichier&lt;/th&gt;
&lt;th&gt;Contenu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chain.hpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BlockHeader&lt;/code&gt;, &lt;code&gt;Block&lt;/code&gt;, &lt;code&gt;Chain&lt;/code&gt; API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chain.cpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PoW, difficulté, récompense, mempool, exécution txs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔗 Voir aussi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.toState-and-Accounts"&gt;State-and-Accounts&lt;/a&gt; — Racine d'état, comptes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.toTransactions"&gt;Transactions&lt;/a&gt; — Sérialisation, gas, exécution&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.toVirtual-Machine-NVM"&gt;Virtual-Machine-NVM&lt;/a&gt; — Appels contrat via VM&lt;/li&gt;
&lt;/ul&gt;



&lt;h1&gt;
  
  
  Cryptography — SHA-256, Keccak-256, secp256k1, ECDSA
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Module&lt;/strong&gt; : &lt;code&gt;src/sha256.hpp/.cpp&lt;/code&gt;, &lt;code&gt;src/keccak.hpp/.cpp&lt;/code&gt;, &lt;code&gt;src/crypto.hpp/.cpp&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📘 About
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Implémentation from scratch de primitives cryptographiques essentielles :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SHA-256 (FIPS 180-4) — hashage de blocs, vecteurs de test XKCP validés&lt;/li&gt;
&lt;li&gt;Keccak-256 — permutation Keccak-f[1600], standard Ethereum&lt;/li&gt;
&lt;li&gt;secp256k1 — courbe elliptique, ECDSA, ecrecover, RFC 6979 nonces déterministes&lt;/li&gt;
&lt;li&gt;HMAC-SHA256 — utilisation RFC 6979 pour génération nonce ECDSA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt; : #cryptography #sha256 #keccak #secp256k1 #ecdsa #rfc6979 #hash #crypto  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt; : Martial Zinsou&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔐 SHA-256 (FIPS 180-4)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Implémentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fichiers&lt;/strong&gt; : &lt;code&gt;src/sha256.hpp/.cpp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classe&lt;/strong&gt; : &lt;code&gt;SHA256&lt;/code&gt; (incrémental : &lt;code&gt;update&lt;/code&gt; / &lt;code&gt;digest&lt;/code&gt;) + &lt;code&gt;sha256(bytes)&lt;/code&gt; stateless&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constantes&lt;/strong&gt; : 8 mots d'init (racines carrées premiers 8 nombres premiers), 64 constantes de tour K&lt;a href="https://dev.toracines%20cubiques%20premiers%2064%20nombres%20premiers"&gt;64&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Padding&lt;/strong&gt; : 1 bit '1', zéros, longueur 64 bits big-endian&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloc&lt;/strong&gt; : 512 bits (64 octets), 64 tours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sortie&lt;/strong&gt; : 256 bits (32 octets, big-endian)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vecteurs de test (FIPS 180-4)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHA256("")      = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
SHA256("abc")   = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA256("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")
                = 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔑 Keccak-256 / SHA3-256 (FIPS 202)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Implémentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fichiers&lt;/strong&gt; : &lt;code&gt;src/keccak.hpp/.cpp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classes&lt;/strong&gt; : &lt;code&gt;Keccak256&lt;/code&gt; (dom=0x01 défaut, dom=0x06 pour SHA3-256), &lt;code&gt;keccak_f1600(uint64_t[25])&lt;/code&gt; cœur exposé&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture éponge&lt;/strong&gt; :

&lt;ul&gt;
&lt;li&gt;État : 1600 bits = 25×64 bits (5×5 lanes)&lt;/li&gt;
&lt;li&gt;Taux (rate) : 1088 bits = 136 octets (Keccak-256)&lt;/li&gt;
&lt;li&gt;Capacité : 512 bits (sécurité 256 bits)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permutation Keccak-f[1600]&lt;/strong&gt; (24 tours) :

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;θ (theta)&lt;/strong&gt; : parité colonnes → XOR lignes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ρ (rho)&lt;/strong&gt; : rotation bit à bit par constantes RHO[5][5]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;π (pi)&lt;/strong&gt; : permutation lanes (x,y) → (y, 2x+3y)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;χ (chi)&lt;/strong&gt; : non-linéaire par ligne &lt;code&gt;a = a ⊕ (¬b ∧ c)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ι (iota)&lt;/strong&gt; : XOR constante de tour RC[round] sur lane (0,0)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Padding multi-rate&lt;/strong&gt; : &lt;code&gt;dom | 0x00* | 0x80&lt;/code&gt; (dom=0x01 Keccak, 0x06 SHA3)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sortie&lt;/strong&gt; : 32 premiers octets de l'état (little-endian lanes → big-endian bytes)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vecteur de test XKCP (permutation)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;keccak_f1600(0) = f1258f7940e1dde7... (premiers 8 octets)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vecteurs Keccak-256 (Ethereum)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Keccak256("")   = c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
Keccak256("abc")= 4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📐 secp256k1 (Elliptic Curve)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paramètres (SEC 2 / Standards for Efficient Cryptography)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p  = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F
   = 2^256 - 2^32 - 977

n  = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
   (ordre du sous-groupe, premier)

Gx = 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
Gy = 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Équation : &lt;code&gt;y² = x³ + 7 (mod p)&lt;/code&gt; (courbe Koblitz, a=0, b=7)&lt;/p&gt;

&lt;h3&gt;
  
  
  Représentation des points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API publique&lt;/strong&gt; : Coordonnées affines &lt;code&gt;(x,y)&lt;/code&gt; (&lt;code&gt;PublicKey&lt;/code&gt; struct)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interne&lt;/strong&gt; : Coordonnées de Jacobien &lt;code&gt;(X,Y,Z)&lt;/code&gt; pour éviter inversions

&lt;ul&gt;
&lt;li&gt;Affine → Jacobien : &lt;code&gt;(x,y) → (x,y,1)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Jacobien → Affine : &lt;code&gt;x = X/Z², y = Y/Z³&lt;/code&gt; (une seule inversion à la fin)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Formules (Jacobien)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Doublage&lt;/strong&gt; (2P) : formule "dbl-2007-bl" (8M + 3S + 7A)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Addition&lt;/strong&gt; (P+Q, P≠Q) : formule "add-2007-bl" (11M + 5S + 9A)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Addition mixte&lt;/strong&gt; (Jacobien + Affine) : optimisée pour &lt;code&gt;ecMulG&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Multiplication scalaire
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Algorithme&lt;/strong&gt; : Échelle binaire gauche→droite (MSB→LSB)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fenêtre&lt;/strong&gt; : Non fenêtrée (simple, constant-time pour bits du scalaire)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Précalcul&lt;/strong&gt; : Aucun (MVP) — optimisable avec table 2⁴ points&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✍️ ECDSA (RFC 6979 Déterministe)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Signature
&lt;/h3&gt;

&lt;p&gt;Données : message hash &lt;code&gt;z&lt;/code&gt; (32 octets), clé privée &lt;code&gt;d&lt;/code&gt; (0 &amp;lt; d &amp;lt; n)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Génération k (RFC 6979)&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HMAC-SHA256 DRBG avec clé = &lt;code&gt;d&lt;/code&gt;, message = &lt;code&gt;z&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Boucle jusqu'à &lt;code&gt;0 &amp;lt; k &amp;lt; n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;k&lt;/code&gt; déterministe pour même &lt;code&gt;(d,z)&lt;/code&gt; — pas d'entropie runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Calcul signature&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;R = k * G&lt;/code&gt; ; &lt;code&gt;r = R.x mod n&lt;/code&gt; (si r=0 → retry)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s = k⁻¹(z + r*d) mod n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low-s&lt;/strong&gt; : si &lt;code&gt;s &amp;gt; n/2&lt;/code&gt; → &lt;code&gt;s = n - s&lt;/code&gt; (BIP-62, malléabilité)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;recid = (R.y &amp;amp; 1) | ((R.x &amp;gt;= n) ? 2 : 0)&lt;/code&gt; (parité y + débordement x)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Vérification
&lt;/h3&gt;

&lt;p&gt;Données : &lt;code&gt;z&lt;/code&gt;, &lt;code&gt;(r,s)&lt;/code&gt;, clé publique &lt;code&gt;Q&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;w = s⁻¹ mod n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;u1 = z*w mod n&lt;/code&gt;, &lt;code&gt;u2 = r*w mod n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;R = u1*G + u2*Q&lt;/code&gt; (addition Jacobien)&lt;/li&gt;
&lt;li&gt;Valide si &lt;code&gt;R.x mod n == r&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Récupération (ecrecover)
&lt;/h3&gt;

&lt;p&gt;Données : &lt;code&gt;z&lt;/code&gt;, &lt;code&gt;(r,s,recid)&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;x = r + (recid &amp;amp; 2 ? n : 0)&lt;/code&gt; (gérer dépassement x ≥ n)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;y² = x³ + 7 mod p&lt;/code&gt; → &lt;code&gt;y = sqrt(y²)&lt;/code&gt; via &lt;code&gt;y = y²^((p+1)/4) mod p&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Choisir &lt;code&gt;y&lt;/code&gt; tel que &lt;code&gt;y &amp;amp; 1 == recid &amp;amp; 1&lt;/code&gt; (parité)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;R = (x,y)&lt;/code&gt; ; &lt;code&gt;e = z&lt;/code&gt; (entier)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Q = r⁻¹(s*R - e*G)&lt;/code&gt; → clé publique récupérée&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🏠 Adresses Nstrike (Style Ethereum)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pubkey = 0x04 || x(32) || y(32)  (65 octets, non-compressed)
address = keccak256(pubkey)[12..31]  (20 derniers octets)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📂 Fichiers Sources
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fichier&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sha256.hpp/.cpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SHA-256 (classe + stateless)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;keccak.hpp/.cpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Keccak-256, SHA3-256, Keccak-f[1600]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crypto.hpp/.cpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;secp256k1, ECDSA, RFC6979, ecrecover, clés, adresses, HMAC-SHA256&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔗 Références
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf" rel="noopener noreferrer"&gt;FIPS 180-4&lt;/a&gt; — SHA-256&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" rel="noopener noreferrer"&gt;FIPS 202&lt;/a&gt; — SHA-3/Keccak&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.secg.org/sec2-v2.pdf" rel="noopener noreferrer"&gt;SEC 2&lt;/a&gt; — Paramètres secp256k1&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc6979" rel="noopener noreferrer"&gt;RFC 6979&lt;/a&gt; — ECDSA déterministe&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/XKCP/XKCP" rel="noopener noreferrer"&gt;XKCP&lt;/a&gt; — Vecteurs Keccak officiels&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.github.io/yellowpaper/paper.pdf" rel="noopener noreferrer"&gt;Ethereum Yellow Paper&lt;/a&gt; — Modèle de référence

# ERC-20 Template — Contrat Jeton Compilé en NVM&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Module&lt;/strong&gt; : &lt;code&gt;src/vm.hpp/.cpp&lt;/code&gt; — &lt;code&gt;erc20Bytecode()&lt;/code&gt;, &lt;code&gt;erc20Deploy()&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📘 About
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Fournir un jeton ERC-20 complet prêt à déployer, écrit en NVM assembly (compilé par &lt;code&gt;assembleNvm&lt;/code&gt;), sans Solidity ni compilateur externe. Layout storage avec 6 slots clés (totalSupply, name, symbol, decimals, balances, allowance). Dispatch par selector sur les 4 premiers octets du calldata. 9 fonctions implémentées : totalSupply, name, symbol, decimals, balanceOf, transfer, approve, transferFrom, allowance. Fonction &lt;code&gt;erc20Deploy&lt;/code&gt; pour déploiement avec init storage et mintage creator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt; : #erc20 #token #smart-contract #nvm #assembly #bytecode #deploy #mintage #solidity-alternative  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt; : Martial Zinsou&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🎯 Objectif
&lt;/h2&gt;

&lt;p&gt;Fournir un &lt;strong&gt;jeton ERC-20 complet&lt;/strong&gt; prêt à déployer, écrit en &lt;strong&gt;NVM assembly&lt;/strong&gt; (compilé par &lt;code&gt;assembleNvm&lt;/code&gt;), sans Solidity ni compilateur externe.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Layout Storage (Slots)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Slot&lt;/th&gt;
&lt;th&gt;Clé&lt;/th&gt;
&lt;th&gt;Contenu&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;word(0)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;totalSupply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;u256&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;word(1)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;name&lt;/code&gt; (ASCII left-aligned, 32 octets)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix32&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;word(2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;symbol&lt;/code&gt; (ASCII left-aligned)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix32&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;word(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;decimals&lt;/code&gt; (u8 dans LSB)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;u256&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;`keccak(addr32 \&lt;/td&gt;
&lt;td&gt;word(4))`&lt;/td&gt;
&lt;td&gt;&lt;code&gt;balances[addr]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 (inner)&lt;/td&gt;
&lt;td&gt;`keccak(owner32 \&lt;/td&gt;
&lt;td&gt;word(5))`&lt;/td&gt;
&lt;td&gt;&lt;code&gt;allowance_inner&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 (outer)&lt;/td&gt;
&lt;td&gt;`keccak(spender32 \&lt;/td&gt;
&lt;td&gt;inner)`&lt;/td&gt;
&lt;td&gt;&lt;code&gt;allowance[owner][spender]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : &lt;code&gt;word(s) = u256::toBytes(u256(s))&lt;/code&gt; (32 octets big-endian).&lt;br&gt;&lt;br&gt;
&lt;code&gt;addr32 = u256::toBytes(u256::fromBytes(addr))&lt;/code&gt; (adresse right-aligned dans 32 octets).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔀 Dispatch par Selector
&lt;/h2&gt;

&lt;p&gt;Le premier mot du calldata (offset 0) = selector aligné à gauche (&lt;code&gt;keccak(sig)[0..3] &amp;lt;&amp;lt; 224&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight armasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;CALLDATASIZE&lt;/span&gt; &lt;span class="nb"&gt;PUSH1&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="nb"&gt;LT&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_revert&lt;/span&gt;
&lt;span class="nl"&gt;PUSH32&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;CALLDATALOAD&lt;/span&gt;
&lt;span class="nl"&gt;PUSH_SEL&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nf"&gt;totalSupply&lt;/span&gt;&lt;span class="err"&gt;()"&lt;/span&gt;      &lt;span class="nb"&gt;EQ&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_total&lt;/span&gt;
&lt;span class="nl"&gt;PUSH_SEL&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="err"&gt;()"&lt;/span&gt;             &lt;span class="nb"&gt;EQ&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_name&lt;/span&gt;
&lt;span class="nl"&gt;PUSH_SEL&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nb"&gt;symbol&lt;/span&gt;&lt;span class="err"&gt;()"&lt;/span&gt;           &lt;span class="nb"&gt;EQ&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_symbol&lt;/span&gt;
&lt;span class="nl"&gt;PUSH_SEL&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nb"&gt;decimals&lt;/span&gt;&lt;span class="err"&gt;()"&lt;/span&gt;         &lt;span class="nb"&gt;EQ&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_decimals&lt;/span&gt;
&lt;span class="nl"&gt;PUSH_SEL&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nf"&gt;balanceOf&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;address&lt;/span&gt;&lt;span class="err"&gt;)"&lt;/span&gt; &lt;span class="nb"&gt;EQ&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_balance&lt;/span&gt;
&lt;span class="nl"&gt;PUSH_SEL&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nb"&gt;transfer&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;address&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;uint256&lt;/span&gt;&lt;span class="err"&gt;)"&lt;/span&gt;       &lt;span class="nb"&gt;EQ&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_transfer&lt;/span&gt;
&lt;span class="nl"&gt;PUSH_SEL&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nb"&gt;approve&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;address&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;uint256&lt;/span&gt;&lt;span class="err"&gt;)"&lt;/span&gt;        &lt;span class="nb"&gt;EQ&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_approve&lt;/span&gt;
&lt;span class="nl"&gt;PUSH_SEL&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nf"&gt;transferFrom&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;address&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;address&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;uint256&lt;/span&gt;&lt;span class="err"&gt;)"&lt;/span&gt; &lt;span class="nb"&gt;EQ&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_from&lt;/span&gt;
&lt;span class="nl"&gt;PUSH_SEL&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nb"&gt;allowance&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;address&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;address&lt;/span&gt;&lt;span class="err"&gt;)"&lt;/span&gt;      &lt;span class="nb"&gt;EQ&lt;/span&gt; &lt;span class="nv"&gt;JUMPI&lt;/span&gt; &lt;span class="nv"&gt;L_allow&lt;/span&gt;
&lt;span class="nl"&gt;REVERT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📋 Fonctions Implémentées (9)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonction&lt;/th&gt;
&lt;th&gt;Selector&lt;/th&gt;
&lt;th&gt;Args (offset)&lt;/th&gt;
&lt;th&gt;Retour&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;totalSupply()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x18160ddd&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;code&gt;supply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Offre totale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x06fdde03&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;name&lt;/code&gt; (32 octets)&lt;/td&gt;
&lt;td&gt;Nom du jeton&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;symbol()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x95d89b41&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;code&gt;symbol&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Symbole&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;decimals()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x313ce567&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;decimals&lt;/code&gt; (u8)&lt;/td&gt;
&lt;td&gt;Décimales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;balanceOf(address)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x70a08231&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;addr&lt;/code&gt;@4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;balance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Solde d'une adresse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;transfer(addr,uint)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0xa9059cbb&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;to&lt;/code&gt;@4, &lt;code&gt;amt&lt;/code&gt;@36&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt;/&lt;code&gt;0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Transfert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;approve(addr,uint)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x095ea7b3&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;spender&lt;/code&gt;@4, &lt;code&gt;amt&lt;/code&gt;@36&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt;/&lt;code&gt;0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Autorisation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;transferFrom(f,t,amt)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x23b872dd&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;from&lt;/code&gt;@4, &lt;code&gt;to&lt;/code&gt;@36, &lt;code&gt;amt&lt;/code&gt;@68&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt;/&lt;code&gt;0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Transfert délégué&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;allowance(o,s)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0xdd62ed3e&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;owner&lt;/code&gt;@4, &lt;code&gt;spender&lt;/code&gt;@36&lt;/td&gt;
&lt;td&gt;&lt;code&gt;allowance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Autorisation restante&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔧 Implémentation Clé (Extraits)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  balanceOf
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L_balance:
    PUSH32 4 CALLDATALOAD        // addr
    PUSH1 4 KECCAK SLOAD         // key=keccak(addr||4), load
    PUSH1 1 RESULT STOP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  transfer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L_transfer:
    PUSH32 4 CALLDATALOAD        // to
    DUP1 ISZERO JUMPI L_revert   // reject to==0
    CALLER PUSH1 4 KECCAK DUP1 SLOAD  // keyC, balC
    PUSH32 36 CALLDATALOAD       // amount
    DUP2 LT ISZERO JUMPI L_revert // balC &amp;lt; amount → revert
    SWAP1 SUB SSTORE             // balC -= amount
    PUSH32 4 CALLDATALOAD PUSH1 4 KECCAK DUP1 SLOAD
    PUSH32 36 CALLDATALOAD ADD SSTORE // bal(to) += amount
    PUSH1 1 RESULT STOP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  approve
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L_approve:
    CALLER PUSH1 5 KECCAK        // inner = keccak(caller||5)
    PUSH32 4 CALLDATALOAD SWAP1 KECCAK // key = keccak(spender||inner)
    PUSH32 36 CALLDATALOAD SSTORE        // allowance = amount
    PUSH1 1 RESULT STOP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  transferFrom
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L_from:
    PUSH32 4 CALLDATALOAD PUSH1 5 KECCAK // innerF
    CALLER SWAP1 KECCAK DUP1 SLOAD       // keyA, allowed
    PUSH32 68 CALLDATALOAD               // amount (arg2)
    DUP2 LT ISZERO JUMPI L_revert        // allowed &amp;lt; amount → revert
    SWAP1 SUB SSTORE                     // allowed -= amount
    // debit from
    PUSH32 4 CALLDATALOAD PUSH1 4 KECCAK DUP1 SLOAD
    PUSH32 68 CALLDATALOAD
    DUP2 LT ISZERO JUMPI L_revert
    SWAP1 SUB SSTORE
    // credit to
    PUSH32 36 CALLDATALOAD PUSH1 4 KECCAK DUP1 SLOAD
    PUSH32 68 CALLDATALOAD ADD SSTORE
    PUSH1 1 RESULT STOP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Déploiement (&lt;code&gt;erc20Deploy&lt;/code&gt;)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;fix20&lt;/span&gt; &lt;span class="nf"&gt;erc20Deploy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;creatorNonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;initialSupply&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;code&gt;addr = deriveContractAddress(creator, creatorNonce)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;state.setCode(addr, erc20Bytecode())&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Storage init :

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;slot 0 = initialSupply&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;slot 1 = name&lt;/code&gt; (ASCII left-aligned 32 octets)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;slot 2 = symbol&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;slot 3 = decimals&lt;/code&gt; (LSB)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;balances[creator] = initialSupply&lt;/code&gt; via &lt;code&gt;keccak(creator||word(4))&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;creatorNonce++&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📂 Fichiers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fichier&lt;/th&gt;
&lt;th&gt;Contenu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vm.hpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API &lt;code&gt;erc20Bytecode()&lt;/code&gt;, &lt;code&gt;erc20Deploy()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vm.cpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Source assembleur &lt;code&gt;ERC20_SRC&lt;/code&gt; + implémentation déploiement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔗 Voir aussi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://eips.ethereum.org/EIPS/eip-20" rel="noopener noreferrer"&gt;EIP-20&lt;/a&gt; — Standard ERC-20&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.soliditylang.org/en/latest/abi-spec.html" rel="noopener noreferrer"&gt;ABI Specification&lt;/a&gt; — Selector encoding&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.toVirtual-Machine-NVM"&gt;Virtual-Machine-NVM&lt;/a&gt; — VM &amp;amp; assembleur&lt;/li&gt;
&lt;/ul&gt;



&lt;h1&gt;
  
  
  RPC Specification — JSON-RPC 2.0
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Module&lt;/strong&gt; : &lt;code&gt;src/rpc.hpp/.cpp&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📘 About
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Serveur JSON-RPC 2.0 en stdio avec 9 endpoints supportés : getbalance, sendtx, getblock, getblockcount, getgasprice, mine, chainstatus, deploytoken, callcontract. Format requête/réponse standard JSON-RPC 2.0. Formats de données : address (20 octets hex), quantity/u256 (64 hex chars), boolean, string. Codes d'erreur : -32700 (parse), -32600 (invalid request), -32601 (method not found), -32602 (invalid params), -32603 (internal). Mode interaction : lecture stdin, écriture stdout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt; : #json-rpc #rpc #stdio #api #endpoints #json #method #getbalance #sendtx #getblock  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt; : Martial Zinsou&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🌐 Endpoints JSON-RPC Supportés
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Requête JSON-RPC 2.0 Standard
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;method_name&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;request_id&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Réponse JSON-RPC 2.0 Succès
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;result&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;request_id&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Réponse JSON-RPC 2.0 Erreur
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;error_code&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;error_message&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;request_id&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📋 Méthodes Supportées
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;getbalance&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Récupérer le solde d'une adresse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paramètres&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xabc123..."&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="s2"&gt;"0x0000000000000000000000000000000000000000000000000000000000000000"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(hex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;string,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;nwei)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exemple&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"getbalance","params":[{"address":"0xabc123"}],"id":1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. &lt;code&gt;sendtx&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Envoyer une transaction signée.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paramètres&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"tx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Transaction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hexadécimale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sérialisée&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="s2"&gt;"0x&amp;lt;hash_32_bytes_hex&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(hash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;transaction)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exemple&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"sendtx","params":[{"tx":"0x0123456789abcdef..."}],"id":1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. &lt;code&gt;getblock&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Récupérer les informations d'un bloc par hauteur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paramètres&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234567890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"miner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"txCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"transactions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. &lt;code&gt;getblockcount&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Récupérer la hauteur actuelle du bloc (dernier bloc).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paramètres&lt;/strong&gt; : &lt;code&gt;[]&lt;/code&gt; (vide)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="s2"&gt;"0x5"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(hex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;string,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hauteur&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;actuelle)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  5. &lt;code&gt;getgasprice&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Récupérer le prix de gas suggéré.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paramètres&lt;/strong&gt; : &lt;code&gt;[]&lt;/code&gt; (vide)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="s2"&gt;"0x1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(hex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;string,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;nwei&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;prix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;minimum)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Remarque&lt;/strong&gt; : Prix fixe de 1 nwei par unité de gas (configuration par défaut).&lt;/p&gt;




&lt;h3&gt;
  
  
  6. &lt;code&gt;mine&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Miner des blocs pour une adresse donnée.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paramètres&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"miner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xabc123..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"blocksMined"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"newHeight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reward"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x32000000000000000000"&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;NST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;en&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  7. &lt;code&gt;chainstatus&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Récupérer l'état complet de la chaîne.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paramètres&lt;/strong&gt; : &lt;code&gt;[]&lt;/code&gt; (vide)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"synced"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currentHeight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"difficultyBits"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"blockTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chainId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  8. &lt;code&gt;deploytoken&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Déployer un contrat jeton ERC-20.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paramètres&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"creator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xabc123..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MyToken"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MTK"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"decimals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"initialSupply"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x1000000000000000000"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="s2"&gt;"0xabc123..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(adresse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;du&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;contrat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;déployé)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  9. &lt;code&gt;callcontract&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Appeler une fonction de contrat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paramètres&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"contract"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xabc123..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"gas"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x5208"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xdef456..."&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Retour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(résultat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;l'appel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;VM,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;string)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔌 Serveur RPC en Ligne de Commande (&lt;code&gt;rpcServeStdio&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mode d'Interaction
&lt;/h3&gt;

&lt;p&gt;Le serveur RPC lit les requêtes JSON depuis &lt;strong&gt;stdin&lt;/strong&gt; et renvoie les réponses sur &lt;strong&gt;stdout&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Démarrage&lt;/span&gt;
./build/nstrike rpc

&lt;span class="c"&gt;# Envoi d'une requête (via un autre terminal ou pipe)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"getbalance","params":[{"address":"0xabc123"}],"id":1}'&lt;/span&gt; | ./build/nstrike rpc

&lt;span class="c"&gt;# Sortie attendue&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"jsonrpc"&lt;/span&gt;:&lt;span class="s2"&gt;"2.0"&lt;/span&gt;,&lt;span class="s2"&gt;"result"&lt;/span&gt;:&lt;span class="s2"&gt;"0x0000000000000000000000000000000000000000000000000000000000000000"&lt;/span&gt;,&lt;span class="s2"&gt;"id"&lt;/span&gt;:1&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implémentation C++
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;rpcServeStdio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Chain&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;Json&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tryParse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Json&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;errResp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;32700&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"parse error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Null&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="n"&gt;fputs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;fputc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'\n'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;fflush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;Json&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rpcHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;fputs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;fputc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'\n'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;fflush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gestion des Erreurs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Message&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-32700&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Parse error&lt;/td&gt;
&lt;td&gt;Requête JSON invalide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-32600&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Invalid Request&lt;/td&gt;
&lt;td&gt;Méthode inconnue ou version JSON-RPC non supportée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-32601&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Method not found&lt;/td&gt;
&lt;td&gt;La méthode n'existe pas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-32602&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Invalid params&lt;/td&gt;
&lt;td&gt;Paramètres invalides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-32603&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Internal error&lt;/td&gt;
&lt;td&gt;Erreur interne au traitement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📦 Formats de Données
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Adresse (&lt;code&gt;address&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Format : 20 octets right-aligned dans 32 octets&lt;/li&gt;
&lt;li&gt;Hexadécimal : &lt;code&gt;0x&lt;/code&gt; + 40 caractères hexadécimaux&lt;/li&gt;
&lt;li&gt;Exemple : &lt;code&gt;0xabc123def4567890123456789012345678901234&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Nonce (&lt;code&gt;quantity&lt;/code&gt; / &lt;code&gt;u256&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Format : hexadécimal non signé 256 bits&lt;/li&gt;
&lt;li&gt;Hexadécimal : &lt;code&gt;0x&lt;/code&gt; + 64 caractères hexadécimaux&lt;/li&gt;
&lt;li&gt;Exemple : &lt;code&gt;0x0000000000000000000000000000000000000000000000000000000000000000&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Booléen (&lt;code&gt;boolean&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt; (JSON standard)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Chaîne (&lt;code&gt;string&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;JSON standard, UTF-8 supporté&lt;/li&gt;
&lt;li&gt;Exemple : &lt;code&gt;"0xabc123..."&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📂 Fichiers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fichier&lt;/th&gt;
&lt;th&gt;Contenu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rpc.hpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Définitions d'endpoints, structures de requête/réponse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rpc.cpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implémentation serveur JSON-RPC, gestion des méthodes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔗 Voir aussi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.toCLI-Reference"&gt;CLI-Reference&lt;/a&gt; — Commandes en ligne de commande&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.toVirtual-Machine-NVM"&gt;Virtual-Machine-NVM&lt;/a&gt; — Appels de contrat via RPC&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.toChain-and-Consensus"&gt;Chain-and-Consensus&lt;/a&gt; — État de la chaîne, minage&lt;/li&gt;
&lt;/ul&gt;



&lt;h1&gt;
  
  
  State and Accounts — Comptes, Stockage, Racines d'État
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Module&lt;/strong&gt; : &lt;code&gt;src/state.hpp/.cpp&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📘 About
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; : Modèle de compte complet avec adresse (fix20), nonce (u256), balance (u256), codeHash (fix32), storageRoot (fix32). Slots storage : slot 0 = totalSupply, slot 1 = name, slot 2 = symbol, slot 3 = decimals, slot 4 = balances[addr] via keccak, slot 5 = allowance via double-keccak. Racines d'état : stateRoot(), storageRoot(), codeHash() implémentées avec keccak accumulative hashing. Validation nonce, protection replay CHAIN_ID.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt; : #state #accounts #storage #root #hash #account-model #u256 #fix32 #keccak  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt; : Martial Zinsou&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  👤 Modèle de Compte
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Structure Account
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Champ&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;address&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adresse (20 octets, right-aligned dans 32 octets)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nonce&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;u256&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nonce du compte (incrémente à chaque tx)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;balance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;u256&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Solde en nwei (1 NST = 10⁹ nwei)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;codeHash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hash du code bytecode (keccak256)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;storageRoot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Racine d'arbre de stockage (patricia)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Déduction d'Adresse
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;fix20&lt;/span&gt; &lt;span class="nf"&gt;deriveAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;privKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Keccak(privKey || 0x00) → last 20 bytes&lt;/span&gt;
    &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;privKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;privKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x00&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nonce &amp;amp; Replay Protection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;state.nonce(addr)&lt;/code&gt; → u256&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tx.nonce&lt;/code&gt; doit égaler &lt;code&gt;state.nonce(sender)&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;++state.nonce(sender)&lt;/code&gt; après exécution réussie&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CHAIN_ID&lt;/code&gt; inclus dans la signature (protection replay cross-chain)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💾 Stockage Contract (Storage Model)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Slots de Storage (32 octets = word)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Slot&lt;/th&gt;
&lt;th&gt;Clé (keccak)&lt;/th&gt;
&lt;th&gt;Contenu&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;totalSupply&lt;/code&gt; (template ERC-20)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;u256&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;name&lt;/code&gt; (template ERC-20, ASCII left-aligned)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix32&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;symbol&lt;/code&gt; (template ERC-20)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix32&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;decimals&lt;/code&gt; (template ERC-20, u8 LSB)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;u256&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;`keccak(addr32 \&lt;/td&gt;
&lt;td&gt;word(4))`&lt;/td&gt;
&lt;td&gt;&lt;code&gt;balances[addr]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;`keccak(spender32 \&lt;/td&gt;
&lt;td&gt;keccak(owner32 \&lt;/td&gt;
&lt;td&gt;word(5)))`&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Accès Stockage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;u256&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))).&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;SLOAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;setBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u256&lt;/span&gt; &lt;span class="n"&gt;bal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))).&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;SSTORE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;u256&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getAllowance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;innerKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))).&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;innerKey&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;SLOAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;setAllowance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u256&lt;/span&gt; &lt;span class="n"&gt;amt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;innerKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Keccak256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))).&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;innerKey&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="n"&gt;SSTORE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stockage Universel (non-ERC-20)
&lt;/h3&gt;

&lt;p&gt;Pour les comptes de base (code, storage patricia) :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Slot&lt;/th&gt;
&lt;th&gt;Clé&lt;/th&gt;
&lt;th&gt;Contenu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;`keccak(addr32 \&lt;/td&gt;
&lt;td&gt;word(0))`&lt;/td&gt;
&lt;td&gt;nonce&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`keccak(addr32 \&lt;/td&gt;
&lt;td&gt;word(1))`&lt;/td&gt;
&lt;td&gt;balance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`keccak(addr32 \&lt;/td&gt;
&lt;td&gt;word(2))`&lt;/td&gt;
&lt;td&gt;codeHash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`keccak(addr32 \&lt;/td&gt;
&lt;td&gt;word(3))`&lt;/td&gt;
&lt;td&gt;storageRoot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🌳 Racines d'État (State Roots)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;stateRoot()&lt;/code&gt; Global
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stateRoot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fix32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HASH_ZERO&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;kv&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;addrW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;fromBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
        &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;nonceW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;balW&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;codeW&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;HASH_ZERO&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;storW&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;storageRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// racine de storage du compte&lt;/span&gt;
        &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;leaf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keccak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addrW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonceW&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;balW&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;codeW&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;storW&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keccak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leaf&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;storageRoot(const fix20&amp;amp; account)&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;storageRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fix32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HASH_ZERO&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;sv&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;keyW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;fromBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
        &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;valW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u256&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;leaf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keccac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valW&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keccak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leaf&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;codeHash(const fix20&amp;amp; account)&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;fix32&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;codeHash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fix20&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;HASH_ZERO&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📂 Fichiers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fichier&lt;/th&gt;
&lt;th&gt;Contenu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;state.hpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Account&lt;/code&gt;, &lt;code&gt;State&lt;/code&gt; API, stockage, racines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;state.cpp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implémentation SLOAD/SSTORE, racines, adresses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔗 Voir aussi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.toTransactions"&gt;Transactions&lt;/a&gt; — Utilisation du storage dans txs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.toVirtual-Machine-NVM"&gt;Virtual-Machine-NVM&lt;/a&gt; — SLOAD/SSTORE en VM&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.toChain-and-Consensus"&gt;Chain-and-Consensus&lt;/a&gt; — Blocs, état global&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>blockchain</category>
      <category>cpp</category>
      <category>crypto</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
