Skip to content

Preuve de travail ​

L'endpoint /pow émet un défi de preuve de travail, une protection anti-bot destinée à remplacer le captcha visuel. Le serveur fournit un salt et une difficulté ; le client cherche un nonce dont l'empreinte sha256 commence par autant de zéros hexadécimaux, puis le renvoie pour vérification.

Comment ça marche ?

À la difficulté par défaut de 4, la résolution demande environ 32 000 hachages — moins d'une seconde dans un navigateur, imperceptible pour une personne, mais ruineuse pour un robot qui la répète des milliers de fois. Contrairement à un captcha visuel, aucun modèle de vision ne peut la contourner : le seul moyen de passer est de dépenser le calcul.

La réponse attendue ne voyage jamais jusqu'au client. Le jeton transporte le salt et la difficulté en clair, mais sa signature est calculée côté serveur avec un secret : elle ne peut être ni forgée, ni relue.

Paramètres ​

ParamètreRequisDescription
difficultyNonNombre de zéros hexadécimaux exigés, entier de 1 à 6. Par défaut : 4

Champs de réponse ​

ChampTypeDescription
algorithmstringAlgorithme de hachage utilisé, toujours sha256
saltstringSel aléatoire à préfixer au nonce
difficultynumberNombre de zéros hexadécimaux initiaux exigés dans l'empreinte
expiresnumberHorodatage d'expiration du jeton, en millisecondes
tokenstringJeton signé à renvoyer pour la vérification
instructionsstringDescription lisible du travail à effectuer

Exemples de code ​

curl -X GET \
  "https://api.sylvain.sh/v5/pow?difficulty=4"

Résoudre le défi est une boucle, donc inexprimable en une seule requête. Incrémentez un compteur jusqu'à ce que l'empreinte corresponde au préfixe exigé :

js
const { salt, difficulty, token } = await (await fetch('https://api.sylvain.sh/v5/pow')).json();
const target = '0'.repeat(difficulty);

let nonce = 0;
while (true) {
    const bytes = new TextEncoder().encode(salt + nonce);
    const hash = await crypto.subtle.digest('SHA-256', bytes);
    const hex = [...new Uint8Array(hash)].map((b) => b.toString(16).padStart(2, '0')).join('');
    if (hex.startsWith(target)) break;
    nonce++;
}

Envoyez ensuite token et nonce à /v5/pow pour faire vérifier la preuve.

Essayer ​

Gestion des erreurs ​

Si les paramètres sont manquants ou invalides, l'API retournera une erreur :

Message d'erreurDescription
Difficulty must be a numberLe paramètre difficulty n'est pas un nombre
Difficulty must be between 1 and 6La difficulty est hors de la plage autorisée

Endpoints associés ​

  • POST /v5/pow - Vérifier un défi résolu
  • GET /v5/captcha - Captcha visuel, l'alternative qu'il remplace