# 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 :
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 :
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 :
bytecode_hash = "ipfs" dans vos projetsRessources :