Tutoriel·6 min de lecture·Par Solingo

Sourcify — Code Source Vérifié pour Chaque Contrat

Sourcify vérifie les smart contracts de manière décentralisée. Pourquoi c'est mieux qu'Etherscan et comment l'utiliser.

# Sourcify — Code Source Vérifié pour Chaque Contrat

Etherscan a centralisé la vérification des smart contracts pendant des années. Sourcify apporte une alternative décentralisée, open-source et plus fiable.

Le Problème de la Vérification Centralisée

Quand vous vérifiez un contrat sur Etherscan :

  • Vous envoyez votre code source à leur serveur privé
  • Ils le compilent et comparent le bytecode
  • Le code est stocké dans leur base de données fermée
  • Si Etherscan disparaît, la vérification disparaît
  • Risques :

    • Single point of failure
    • Pas de garantie de reproductibilité
    • Dépendance à une entreprise privée
    • Pas d'interopérabilité entre chaînes

    Comment Sourcify Fonctionne

    Sourcify utilise les metadata Solidity embarquées dans le bytecode :

    contract Token {
    

    string public name = "MyToken";

    }

    // Le compilateur ajoute automatiquement à la fin du bytecode :

    // 0xa264... <hash IPFS des metadata>

    Les metadata contiennent :

    • Le code source complet
    • La version exacte du compilateur
    • Les paramètres de compilation (optimizer, runs, etc.)
    • Les imports et leurs versions

    Sourcify :

  • Extrait le hash IPFS du bytecode on-chain
  • Récupère les metadata depuis IPFS
  • Recompile le code avec les mêmes paramètres
  • Compare le bytecode obtenu avec celui on-chain
  • Résultat : vérification 100% reproductible et décentralisée.

    Full Match vs Partial Match

    Full Match (Perfect Match)

    Le bytecode recompilé est identique octet par octet au bytecode on-chain :

    forge verify-contract \
    

    0x1234... \

    src/Token.sol:Token \

    --verifier sourcify

    # ✅ Full match: metadata hash + bytecode identiques

    Garanties :

    • Code source exact
    • Aucune modification possible
    • Confiance maximale pour les auditeurs

    Partial Match

    Le bytecode est identique sauf pour les metadata finales :

    // Même code, mais compilé avec :
    

    // - optimizer runs différent (200 vs 1000)

    // - metadata IPFS différent

    // → bytecode fonctionnel identique, metadata différentes

    Cas d'usage : contrats upgradeable où les metadata changent entre déploiements.

    Utilisation avec Foundry

    1. Activer les Metadata dans foundry.toml

    [profile.default]
    

    optimizer = true

    optimizer_runs = 200

    bytecode_hash = "ipfs" # Génère le hash IPFS

    cbor_metadata = true # Inclut les metadata dans le bytecode

    2. Déployer et Vérifier

    # Déployer
    

    forge create src/Token.sol:Token \

    --rpc-url $RPC_URL \

    --private-key $PRIVATE_KEY

    # Vérifier sur Sourcify

    forge verify-contract \

    0xYourContractAddress \

    src/Token.sol:Token \

    --verifier sourcify \

    --chain-id 1

    # ✅ Contract successfully verified on Sourcify

    3. Vérifier un Contrat Existant

    # Si vous avez le code source original
    

    forge verify-contract \

    0x1234... \

    src/MyContract.sol:MyContract \

    --verifier sourcify \

    --constructor-args $(cast abi-encode "constructor(uint256)" 1000)

    Utilisation avec Hardhat

    // hardhat.config.js
    

    module.exports = {

    solidity: {

    version: "0.8.20",

    settings: {

    optimizer: { enabled: true, runs: 200 },

    metadata: {

    bytecodeHash: "ipfs"

    }

    }

    },

    sourcify: {

    enabled: true

    }

    };

    npx hardhat verify --network mainnet 0x1234... "Constructor Arg"
    

    # Vérifie automatiquement sur Sourcify + Etherscan

    API Sourcify pour les Auditeurs

    Vérifier un Contrat

    curl https://sourcify.dev/server/check-by-addresses \
    

    -d '{"addresses":["0x1234..."], "chainIds":["1"]}'

    # Réponse :

    # [{"address":"0x1234...","chainIds":["1"],"status":"perfect"}]

    Récupérer le Code Source

    curl https://sourcify.dev/server/files/1/0x1234...
    
    

    # Retourne :

    # - metadata.json (metadata complètes)

    # - sources/ (tous les fichiers .sol)

    Exemple : Script d'Audit Automatisé

    async function auditContract(address, chainId) {
    

    const res = await fetch(https://sourcify.dev/server/files/${chainId}/${address});

    if (!res.ok) {

    console.log("⚠️ Contract not verified on Sourcify");

    return;

    }

    const files = await res.json();

    // Analyser les sources

    for (const file of files.sources) {

    if (file.content.includes("selfdestruct")) {

    console.log("🚨 Contains selfdestruct!");

    }

    if (!file.content.includes("SPDX-License-Identifier")) {

    console.log("⚠️ Missing license");

    }

    }

    // Vérifier les paramètres de compilation

    const optimizer = files.metadata.settings.optimizer;

    if (optimizer.runs < 200) {

    console.log("⚠️ Low optimizer runs, high gas costs");

    }

    }

    Avantages pour les Auditeurs

    1. Reproductibilité Garantie

    # Récupérer les metadata
    

    curl https://sourcify.dev/server/files/1/0x1234.../metadata.json > meta.json

    # Extraire compiler + settings

    jq '.compiler.version' meta.json # "0.8.20+commit.a1b2c3"

    jq '.settings.optimizer' meta.json

    # Recompiler localement

    solc --version # Vérifier la version

    solc @openzeppelin=./node_modules/@openzeppelin src/Contract.sol

    2. Détection des Proxy Malveillants

    # Un contrat se prétend être USDC mais le code est différent
    

    curl https://sourcify.dev/server/check-by-addresses \

    -d '{"addresses":["0xSuspiciousUSDC"], "chainIds":["1"]}'

    # → "status": "false" (pas de match)

    # → 🚨 Contrat non vérifié ou code modifié

    Limites et Workarounds

    Problème : Metadata Manquantes

    Si le contrat a été compilé avec bytecode_hash = "none" :

    // Pas de hash IPFS dans le bytecode
    

    // → Sourcify ne peut pas faire de Full Match

    Solution : utiliser Partial Match ou vérifier manuellement.

    Problème : Dépendances Non Résolues

    # Erreur : "@openzeppelin/contracts/..." not found

    Solution : inclure tous les fichiers dans la vérification :

    forge flatten src/Token.sol > Flattened.sol
    

    forge verify-contract 0x1234... Flattened.sol:Token --verifier sourcify

    Sourcify vs Etherscan

    | Critère | Sourcify | Etherscan |

    |---------|----------|-----------|

    | Décentralisé | ✅ IPFS | ❌ Serveurs privés |

    | Open-source | ✅ | ❌ |

    | Multi-chain | ✅ 100+ chains | ⚠️ Limité |

    | API gratuite | ✅ | ⚠️ Rate-limited |

    | Full Match | ✅ | ❌ |

    Best Practice : vérifier sur les deux pour maximiser la visibilité.

    Conclusion

    Sourcify est l'avenir de la vérification décentralisée. En 2026, tous les outils (Foundry, Hardhat, Tenderly) l'intègrent par défaut.

    Action items :

  • Activez bytecode_hash = "ipfs" dans vos projets
  • Vérifiez systématiquement sur Sourcify après déploiement
  • Utilisez l'API Sourcify dans vos scripts d'audit
  • Ressources :

    Prêt à mettre en pratique ?

    Applique ces concepts avec des exercices interactifs sur Solingo.

    Commencer gratuitement