Banc comparatif : SHA-256, Argon2id, Equi-X
Ce banc lance les mêmes scénarios sur chaque appareil (au moins 100 défis par scénario), vérifie chaque preuve, mesure le débit de vérification, et produit un fichier JSON à agréger avec scripts/agreger-banc.ts pour remplir le tableau comparatif du README.
Fiche de l’appareil
Détecté par la page ; complète les champs libres avant de lancer : ils identifient la machine dans le tableau.
Fiche machine par commande (facultatif, recommandé)
Copie la commande de ton système dans un terminal : elle écrit config-machine.json dans le dossier courant et l’affiche (modèle, processeur et fréquence, cœurs physiques et logiques, mémoire vive, GPU, système), sans rien envoyer sur le réseau. Importe ensuite le fichier, ou colle son contenu ci-dessous : il est joint à l’export.
Linux
# Fiche machine pour le banc pow-equix-wasm — Linux (bash). Écrit config-machine.json
# dans le dossier courant et l’affiche. Rien n’est envoyé sur le réseau.
(
j() { printf '%s' "$1" | tr -d '\000-\037' | sed 's/\\/\\\\/g; s/"/\\"/g; s/^/"/; s/$/"/'; }
lire() { [ -r "$1" ] && tr -d '\n' < "$1" | sed 's/[[:space:]]*$//' | grep -viE '^(not applicable|to be filled.*|system (product name|version)|default string|none|0123456789|)$'; }
nb() { case "$1" in ''|*[!0-9]*) printf 'null' ;; *) printf '%s' "$1" ;; esac; }
fabricant=$(lire /sys/class/dmi/id/sys_vendor)
modele=$(lire /sys/class/dmi/id/product_name)
version=$(lire /sys/class/dmi/id/product_version)
[ -z "$modele" ] && modele=$(tr -d '\000' < /proc/device-tree/model 2>/dev/null)
processeur=$(grep -m1 -E '^(model name|Hardware|Processor)[[:space:]]*:' /proc/cpuinfo | cut -d: -f2- | sed 's/^[[:space:]]*//')
[ -z "$processeur" ] && processeur=$(LC_ALL=C lscpu 2>/dev/null | grep -m1 '^Model name' | cut -d: -f2- | sed 's/^[[:space:]]*//')
logiques=$(grep -c '^processor' /proc/cpuinfo)
physiques=$(lscpu -p=CORE,SOCKET 2>/dev/null | grep -v '^#' | sort -u | wc -l)
[ "$physiques" = 0 ] && physiques=''
khz=$(cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq 2>/dev/null | sort -n | tail -1)
mhz=''; [ -n "$khz" ] && mhz=$((khz / 1000))
[ -z "$mhz" ] && mhz=$(LC_ALL=C lscpu 2>/dev/null | grep -m1 'CPU max MHz' | awk -F: '{printf "%d", $2}')
# Turbo : désactivé, la fréquence maximale ci-dessus est la fréquence de base.
turbo=null
if [ -r /sys/devices/system/cpu/cpufreq/boost ]; then [ "$(cat /sys/devices/system/cpu/cpufreq/boost)" = 1 ] && turbo=true || turbo=false
elif [ -r /sys/devices/system/cpu/intel_pstate/no_turbo ]; then [ "$(cat /sys/devices/system/cpu/intel_pstate/no_turbo)" = 0 ] && turbo=true || turbo=false
fi
ram=$(awk '/^MemTotal:/ {print $2 * 1024}' /proc/meminfo)
gpus=''
if command -v lspci >/dev/null 2>&1; then
while IFS= read -r ligne; do [ -n "$ligne" ] && gpus="$gpus${gpus:+, }$(j "$ligne")"; done <<GPU
$(lspci 2>/dev/null | grep -Ei 'vga|3d|display' | cut -d: -f3- | sed 's/^[[:space:]]*//')
GPU
fi
systeme=$(. /etc/os-release 2>/dev/null; printf '%s' "${PRETTY_NAME:-Linux}")
cat > config-machine.json <<JSON
{
"format": "pow-equix-wasm/config-machine",
"version": 1,
"source": "linux",
"date": $(j "$(date -u +%Y-%m-%dT%H:%M:%SZ)"),
"machine": { "fabricant": $(j "$fabricant"), "modele": $(j "$modele${version:+ ($version)}") },
"processeur": { "modele": $(j "$processeur"), "frequenceMaxMHz": $(nb "$mhz"), "turbo": $turbo, "coeursPhysiques": $(nb "$physiques"), "coeursLogiques": $(nb "$logiques"), "architecture": $(j "$(uname -m)") },
"memoire": { "totaleOctets": $(nb "$ram") },
"gpu": [$gpus],
"systeme": { "nom": $(j "$systeme"), "noyau": $(j "$(uname -sr)") }
}
JSON
cat config-machine.json
)
macOS
# Fiche machine pour le banc pow-equix-wasm — macOS (bash ou zsh). Écrit
# config-machine.json dans le dossier courant et l’affiche. Rien n’est envoyé sur le réseau.
(
j() { printf '%s' "$1" | tr -d '\000-\037' | sed 's/\\/\\\\/g; s/"/\\"/g; s/^/"/; s/$/"/'; }
nb() { case "$1" in ''|*[!0-9]*) printf 'null' ;; *) printf '%s' "$1" ;; esac; }
materiel=$(system_profiler SPHardwareDataType 2>/dev/null)
champ() { printf '%s\n' "$materiel" | awk -F': ' -v cle="$1" '$1 ~ cle {print $2; exit}'; }
modele="$(champ 'Model Name') ($(champ 'Model Identifier'))"
processeur=$(sysctl -n machdep.cpu.brand_string 2>/dev/null)
[ -z "$processeur" ] && processeur=$(champ 'Chip')
hz=$(sysctl -n hw.cpufrequency_max 2>/dev/null)
mhz=''; [ -n "$hz" ] && mhz=$((hz / 1000000))
gpus=''
while IFS= read -r ligne; do [ -n "$ligne" ] && gpus="$gpus${gpus:+, }$(j "$ligne")"; done <<GPU
$(system_profiler SPDisplaysDataType 2>/dev/null | awk -F': ' '/Chipset Model/ {print $2}')
GPU
cat > config-machine.json <<JSON
{
"format": "pow-equix-wasm/config-machine",
"version": 1,
"source": "macos",
"date": $(j "$(date -u +%Y-%m-%dT%H:%M:%SZ)"),
"machine": { "fabricant": "Apple", "modele": $(j "$modele") },
"processeur": { "modele": $(j "$processeur"), "frequenceMaxMHz": $(nb "$mhz"), "turbo": null, "coeursPhysiques": $(nb "$(sysctl -n hw.physicalcpu)"), "coeursLogiques": $(nb "$(sysctl -n hw.logicalcpu)"), "architecture": $(j "$(uname -m)") },
"memoire": { "totaleOctets": $(nb "$(sysctl -n hw.memsize)") },
"gpu": [$gpus],
"systeme": { "nom": $(j "macOS $(sw_vers -productVersion) ($(sw_vers -buildVersion))"), "noyau": $(j "$(uname -sr)") }
}
JSON
cat config-machine.json
)
Windows (PowerShell)
# Fiche machine pour le banc pow-equix-wasm — Windows (PowerShell 5 ou 7). Écrit
# config-machine.json dans le dossier courant et l’affiche. Rien n’est envoyé sur le réseau.
& {
$processeurs = @(Get-CimInstance Win32_Processor)
$machine = Get-CimInstance Win32_ComputerSystem
$systeme = Get-CimInstance Win32_OperatingSystem
$fiche = [ordered]@{
format = 'pow-equix-wasm/config-machine'
version = 1
source = 'windows'
date = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
machine = [ordered]@{ fabricant = "$($machine.Manufacturer)".Trim(); modele = "$($machine.Model)".Trim() }
processeur = [ordered]@{
modele = "$($processeurs[0].Name)".Trim()
frequenceMaxMHz = [int]$processeurs[0].MaxClockSpeed
turbo = $null
coeursPhysiques = [int]($processeurs | Measure-Object -Property NumberOfCores -Sum).Sum
coeursLogiques = [int]($processeurs | Measure-Object -Property NumberOfLogicalProcessors -Sum).Sum
architecture = "$env:PROCESSOR_ARCHITECTURE"
}
memoire = [ordered]@{ totaleOctets = [long]$machine.TotalPhysicalMemory }
gpu = @(Get-CimInstance Win32_VideoController | ForEach-Object { "$($_.Name)".Trim() })
systeme = [ordered]@{ nom = "$($systeme.Caption) $($systeme.Version)".Trim(); noyau = "$($systeme.BuildNumber)" }
}
$json = $fiche | ConvertTo-Json -Depth 4
[System.IO.File]::WriteAllText((Join-Path (Get-Location) 'config-machine.json'), $json, (New-Object System.Text.UTF8Encoding $false))
$json
}
Android (Termux)
# Fiche machine pour le banc pow-equix-wasm — Android, dans Termux. Écrit
# config-machine.json dans le dossier courant et l’affiche. Rien n’est envoyé sur le réseau.
(
j() { printf '%s' "$1" | tr -d '\000-\037' | sed 's/\\/\\\\/g; s/"/\\"/g; s/^/"/; s/$/"/'; }
nb() { case "$1" in ''|*[!0-9]*) printf 'null' ;; *) printf '%s' "$1" ;; esac; }
prop() { getprop "$1" 2>/dev/null; }
soc="$(prop ro.soc.manufacturer) $(prop ro.soc.model)"
materiel=$(grep -m1 -E '^Hardware' /proc/cpuinfo | cut -d: -f2- | sed 's/^[[:space:]]*//')
processeur=$(printf '%s' "${soc# }${materiel:+ / $materiel}" | sed 's/^[[:space:]]*//')
khz=$(cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq 2>/dev/null | sort -n | tail -1)
mhz=''; [ -n "$khz" ] && mhz=$((khz / 1000))
logiques=$(grep -c '^processor' /proc/cpuinfo)
ram=$(awk '/^MemTotal:/ {print $2 * 1024}' /proc/meminfo)
gpu=$(prop ro.hardware.egl)
cat > config-machine.json <<JSON
{
"format": "pow-equix-wasm/config-machine",
"version": 1,
"source": "android-termux",
"date": $(j "$(date -u +%Y-%m-%dT%H:%M:%SZ)"),
"machine": { "fabricant": $(j "$(prop ro.product.manufacturer)"), "modele": $(j "$(prop ro.product.model) ($(prop ro.product.device))") },
"processeur": { "modele": $(j "$processeur"), "frequenceMaxMHz": $(nb "$mhz"), "turbo": null, "coeursPhysiques": $(nb "$logiques"), "coeursLogiques": $(nb "$logiques"), "architecture": $(j "$(uname -m)") },
"memoire": { "totaleOctets": $(nb "$ram") },
"gpu": [$( [ -n "$gpu" ] && j "$gpu")],
"systeme": { "nom": $(j "Android $(prop ro.build.version.release) (API $(prop ro.build.version.sdk))"), "noyau": $(j "$(uname -sr)") }
}
JSON
cat config-machine.json
)
Sans terminal : remplis simplement les champs ci-dessous (au moins le modèle).
Scénarios
Scénarios par défaut : défi visé ≈ 1 s (médiane, tous les cœurs, sur le PC de référence), 80 % des défis dans un rapport ≤ 2 (p90/p10 ≤ 2). Parts fixées par la théorie (p90/p10 ≤ 2 sur 8 fils), difficultés à calibrer sur le PC de référence, puis à importer telles quelles ailleurs. La durée de mesure du débit maximal (dureeDebitMs) reste provisoire.
Fichier JSON pow-equix-wasm/banc-scenarios : dureeCibleMs (médiane visée par le calibrage), dureeDebitMs (mesure du débit maximal), calibrage (machine de référence), et scenarios : { id, libelle, algorithme (sha256, argon2id, equix), parametres, parts, difficulte, fils (« coeurs » par défaut), sansParallelisation, repetitions }. Difficulté : bits nuls en tête pour SHA-256 et Argon2id, effort pour Equi-X. La mémoire se règle pour Argon2id { memoireKio, iterations, parallelisme } comme pour Equi-X { n, compilation }. Les fils sont plafonnés par la mémoire de l’appareil (Argon2id, Equi-X).
Estimation
D’après des durées de référence, puis d’après une mesure de vitesse sur cet appareil. Pour chaque scénario : les défis seuls sur tous les cœurs (latence), puis le débit maximal (dureeDebitMs), puis le banc de vérification (3 s par configuration, sur 1 fil puis sur tous les cœurs). Chaque défi terminé est enregistré dans ce navigateur : après un plantage, relancer reprend où le banc s’était arrêté (3 tentatives au plus par scénario).
Machine de référence
Sur le PC de référence seulement, tous les cœurs : ajuste la difficulté de chaque scénario pour que la médiane d’un défi atteigne dureeCibleMs (1 s), les parts suivant la théorie (plus petit nombre donnant p90/p10 ≤ 2), avec un contrôle informatif sur 100 défis, puis fige le résultat dans le fichier de scénarios, à télécharger et à importer tel quel sur les autres machines.
Progression
Résultats
Débit de vérification
Parts valides vérifiées par seconde (résistance au déni de service), sur 1 fil et sur tous les cœurs.
Exporter
Fichier complet, schéma pow-equix-wasm/banc version 1 (demo/banc/schema.ts), à agréger avec les autres appareils :