Esc
 Naviguer  Ouvrir Esc Fermer
Aller au contenu

16.6 — Web3 (si pertinent)

🎯 Objectif : avoir une compréhension claire du Web3 web-side — connecter un wallet, signer, lire un contrat, déclencher une transaction — et savoir reconnaître les cas où le Web3 apporte vraiment, vs ceux où il ne fait que compliquer un produit qui marcherait mieux en Web2.

À l'issue de cet axe, tu sauras :

  • Comprendre les briques (wallet, signature, RPC, contrat, gas) sans buzzword
  • Connecter un wallet et signer un message ("Sign-In With Ethereum")
  • Lire et écrire dans un contrat avec viem ou ethers
  • Identifier les patterns frontend Web3 standards (wagmi, RainbowKit, AppKit)
  • Savoir dire NON quand Web3 n'apporte rien vs un Web2 mature

Avancé 13 min prérequis : axes 1-14 maîtrisés

Avant tout — quand Web3 est pertinent (vraiment)

Section intitulée « Avant tout — quand Web3 est pertinent (vraiment) »

« Un trésor caché derrière chaque hype. La hype, c’est le mensonge. Le trésor, c’est ce qui reste après. »

Le Web3 a connu plusieurs vagues de hype (2017 ICOs, 2021 NFTs, 2024 RWA / restaking). Beaucoup de projets web3 auraient été mieux servis par une bonne base Web2 (Postgres + Stripe + auth classique).

CasPourquoi Web3
Tokens transférables entre utilisateurs (sans intermédiaire forcé)Une DB classique nécessite un opérateur
Custody auto-souveraineL’utilisateur garde ses clés ; pas de captation par le service
Cross-platform composabilityPlusieurs apps lisent / écrivent la même donnée on-chain
Settlement sans tiers de confianceÉchange peer-to-peer prouvable
Identité décentralisée (DID, ENS)Identité portable sans dépendre d’une plateforme
Programmes auto-exécutables (vesting, escrow)Garanties cryptographiques vs procédure légale
Pseudo-besoin Web3Solution Web2 plus adaptée
« Stocker des photos sur la blockchain »S3 / R2 + hashes vérifiables
« Login sans mot de passe »Passkeys (WebAuthn)
« Programme de fidélité »DB classique + Stripe
« Authentifier l’origine d’un produit »Hash + DB + signature serveur
« Voter sans triche »Service tiers de confiance vérifiable
« Internationaliser sans conversion »Stripe en multi-devise

Avant tout projet Web3, demande-toi : « Pourquoi pas une DB classique + signature serveur ? ». Si la réponse n’est pas claire, reste en Web2.


Un wallet est un gestionnaire de clés cryptographiques (privées + publiques). À partir de la clé privée, on dérive :

  • Adresse Ethereum (0x...) — l’identifiant public.
  • Signature — preuve cryptographique d’un message.
  • Capacité d’envoyer des transactions sur la blockchain.

Wallets courants 2026 :

WalletType
MetaMaskExtension navigateur + mobile, le plus déployé
RabbyExtension orientée DeFi sécurisé
Coinbase WalletSelf-custody Coinbase
PhantomMulti-chaîne (EVM + Solana)
WalletConnectProtocole, pas un wallet
Embedded wallets (Privy, Magic, Web3Auth, Dynamic)Wallets « invisibles » créés via email/social pour onboarder grand public

Un RPC node (Remote Procedure Call) est un serveur qui expose la blockchain via JSON-RPC. Tu lis l’état (balance, contrat) ou pousses des transactions.

ProviderForce
AlchemyExcellent SDK, dev tools
InfuraHistorique, fiable
QuickNodeMulti-chaîne, perf
AnkrDecentralized, gratuit
Self-hostNécessaire si vraiment décentralisé
ChainSpécificité
Ethereum L1Le plus sûr, le plus cher en gas
L2 EVM (Base, Arbitrum, Optimism, zkSync)Moins cher, settle sur Ethereum
Polygon PoSEVM, frais très bas
SolanaNon-EVM, ultra rapide, frais ~0,001 $
BitcoinHors scope EVM, pas Smart contracts traditionnels

En 2026, la majorité des apps Web3 « grand public » tournent sur L2 (Base, Arbitrum) ou Solana. Pas L1 — trop cher pour les flux courants.

Chaque transaction sur EVM coûte du gas (proportionnel au compute du contrat) × gas price (en gwei, varie selon la congestion).

Coût transaction = gas utilisé × gas price

Ordre de grandeur :

  • Transfer ETH : ~21 000 gas.
  • Transfer ERC-20 (USDC) : ~50 000 gas.
  • Mint NFT : ~80 000 - 200 000 gas.
  • Swap Uniswap : ~150 000 gas.

Sur Ethereum L1 (gas price 20-100 gwei) → 5-50 $ par transaction simple. Sur Base (~0,1 gwei) → 0,01-0,10 $.


Un pattern d’auth standard (EIP-4361) : l’utilisateur signe un message avec son wallet, et le serveur vérifie la signature.

1. Utilisateur clique "Connecter wallet"
2. App génère un nonce aléatoire
3. App demande au wallet de signer un message avec le nonce
4. Wallet retourne la signature
5. Serveur vérifie la signature, démarre la session
import { createWalletClient, custom } from 'viem';
import { mainnet } from 'viem/chains';
const wallet = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum!),
});
const [address] = await wallet.requestAddresses();
const signature = await wallet.signMessage({
account: address,
message: `Connectez-vous à monapp.com\n\nNonce: ${nonce}`,
});
import { verifyMessage } from 'viem';
const valid = await verifyMessage({
address: claimedAddress,
message: messageWithNonce,
signature,
});
if (valid) {
// Crée la session, JWT, cookie HttpOnly
}

SIWE est devenu le « OAuth Web3 » : universellement supporté, simple à implémenter, tu te débarrasses de la gestion des mots de passe.


Deux libs JS dominent 2026 pour interagir avec EVM :

LibForce
viemTS-first, tree-shakable, plus moderne (2023+), partout dans la stack 2026
ethersHistorique (2019), encore très utilisé, v6 propre
web3.jsLe plus ancien, à éviter pour un nouveau projet

En 2026 : viem par défaut. ethers reste correct si tu hérites d’un repo l’utilisant.

import { createPublicClient, http, formatEther } from 'viem';
import { mainnet } from 'viem/chains';
const client = createPublicClient({
chain: mainnet,
transport: http('https://eth-mainnet.g.alchemy.com/v2/KEY'),
});
const balance = await client.getBalance({ address: '0xabc...' });
console.log(formatEther(balance), 'ETH');
import { createPublicClient, http, erc20Abi } from 'viem';
import { mainnet } from 'viem/chains';
const client = createPublicClient({ chain: mainnet, transport: http() });
const usdcBalance = await client.readContract({
address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', // USDC
abi: erc20Abi,
functionName: 'balanceOf',
args: ['0xabc...'],
});
import { createWalletClient, custom, parseEther } from 'viem';
import { mainnet } from 'viem/chains';
const wallet = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum!),
});
const [account] = await wallet.requestAddresses();
const hash = await wallet.sendTransaction({
account,
to: '0xrecipient...',
value: parseEther('0.01'),
});
console.log('tx hash:', hash);

wagmi est le standard de facto pour intégrer Web3 dans une app React.

import { WagmiProvider, createConfig, http } from 'wagmi';
import { mainnet, base } from 'wagmi/chains';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const config = createConfig({
chains: [mainnet, base],
transports: { [mainnet.id]: http(), [base.id]: http() },
});
export default function App({ children }) {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={new QueryClient()}>
{children}
</QueryClientProvider>
</WagmiProvider>
);
}
import { useAccount, useConnect, useDisconnect, useBalance } from 'wagmi';
function Profile() {
const { address, isConnected } = useAccount();
const { connect, connectors } = useConnect();
const { disconnect } = useDisconnect();
const { data: balance } = useBalance({ address });
if (!isConnected) {
return connectors.map((c) => (
<button key={c.id} onClick={() => connect({ connector: c })}>
{c.name}
</button>
));
}
return (
<div>
<p>{address}</p>
<p>{balance?.formatted} {balance?.symbol}</p>
<button onClick={() => disconnect()}>Déconnecter</button>
</div>
);
}

Pour ne pas réécrire l’UI de connexion :

KitForce
RainbowKitUX excellente, intégré wagmi
AppKit (ex-Web3Modal)Multi-chain, multi-wallet, riche
ConnectKitMinimaliste, propre
Privy / DynamicEmbedded wallets + email login

Tu n’as pas besoin de maîtriser Solidity pour faire du dev frontend Web3. Mais tu dois comprendre :

ConceptÀ quoi ça sert
ABI (Application Binary Interface)Schéma JSON du contrat — les fonctions et events
Read vs WriteRead = gratuit (lit l’état). Write = transaction = gas
EventsLe contrat émet des logs queryables (équivalent webhooks)
MulticallGrouper plusieurs reads en 1 RPC
Permit (EIP-2612)Approve via signature, pas de tx séparée
EIP-1271Vérifier signature d’un smart-account (ERC-4337)
[
{ "name": "balanceOf", "type": "function", "stateMutability": "view",
"inputs": [{ "name": "owner", "type": "address" }],
"outputs": [{ "type": "uint256" }] },
{ "name": "transfer", "type": "function", "stateMutability": "nonpayable",
"inputs": [{ "name": "to", "type": "address" }, { "name": "amount", "type": "uint256" }],
"outputs": [{ "type": "bool" }] },
{ "name": "Transfer", "type": "event",
"inputs": [
{ "indexed": true, "name": "from", "type": "address" },
{ "indexed": true, "name": "to", "type": "address" },
{ "indexed": false, "name": "value", "type": "uint256" }
] }
]

Pour suivre les transactions historiques d’une adresse, ne pollute pas ton RPC node. Utilise un indexer :

IndexerForce
The GraphOSS, GraphQL, le plus mature
Subgraph StudioHébergement gratuit / payant
GoldskySubgraphs + streaming
Envio HyperIndexPlus rapide à indexer
Alchemy SubgraphsManaged
PonderSelf-host TS-first

Account Abstraction (ERC-4337) — la promesse 2026

Section intitulée « Account Abstraction (ERC-4337) — la promesse 2026 »

Les smart accounts (ERC-4337, EIP-7702) permettent :

  • Pay gas in token (l’utilisateur paie en USDC, pas en ETH).
  • Sponsoring (l’app paie le gas pour l’utilisateur — UX magique).
  • Multi-sig embarqué.
  • Session keys (auto-approuver pendant 1 h sans repop le wallet).
  • Recovery social (pas perdre ses fonds si on perd le seed phrase).
OutilQuoi
Pimlico, Stackup, BiconomyBundlers ERC-4337 + paymasters
Privy embedded walletsAuth email + smart account natif
Safe (Gnosis)Multi-sig le plus déployé

2026 : l’AA devient le défaut grand public. Demander à un user de comprendre « gas en ETH » est obsolète quand on peut sponsoriser.


SymptômeRéalité
Stocker une donnée volumineuse on-chainCatastrophique (cher, lent). Stocke en S3, hash on-chain
Mainnet L1 pour des micro-transactionsFrais > valeur. L2 obligatoire
Pas de protection slippage sur swapL’utilisateur perd 5-50 %
Approuver MaxUint256 à un contrat inconnuDrain risk — toujours approver le minimum nécessaire
Affichage user-friendly (« 1 ETH ») mais signer en wei sans préciserErreurs de × 1e18 — afficher la décimale exacte signée
Polling l’API RPC tous les 1sTue ta facture Alchemy. Utilise WebSocket ou un indexer
Pas de gestion offline / wallet absentPage blanche si MetaMask pas installé
Demander une signature au bootSurprend l’user. Demander uniquement à la connexion explicite

AspectÀ savoir
MiCA (UE, en vigueur 2024-2026)Encadre crypto-assets et stablecoins. Audit pour CASP.
AML / KYCSi tu manipules de la valeur monétaire pour des tiers, ça s’applique
TVASur les NFT, position varie selon pays
SanctionsBloquer les adresses sanctionnées (OFAC) — checks comme Chainalysis
Data RGPDUne adresse Ethereum est une donnée personnelle (pseudonymisée mais identifiable)

Le légal Web3 est un domaine à part entière. Ne lance pas un produit qui manipule de la valeur sans avis juridique.


Un client te demande une « blockchain interne pour tracer les commandes ». L'app n'aura pas de tokens, pas d'utilisateurs externes, juste un audit trail. Que proposes-tu ?
Tu veux ajouter une auth Web3 simple. Quel pattern en 2026 ?
Tu intègres une fonctionnalité d'achat NFT pour 1000 utilisateurs / mois sur Ethereum Mainnet. Coût attendu ?
Tu écoutes les events `Transfer` de un contrat ERC-20 en pollant `eth_getLogs` toutes les secondes. Ta facture RPC explose. Solution ?


Retour : Index axe 16 — choisis ta spécialisation et applique-la sur le projet de l’axe.