Comparison bench: SHA-256, Argon2id, Equi-X
This bench runs the same scenarios on every device (at least 100 challenges per scenario), verifies every proof, measures verification throughput, and produces a JSON file to aggregate with scripts/agreger-banc.ts to fill the README comparison table.
Device sheet
Detected by the page; fill in the free fields before starting: they identify the machine in the table.
Machine sheet from a command (optional, recommended)
Copy the command for your system into a terminal: it writes config-machine.json in the current folder and prints it (model, processor and frequency, physical and logical cores, RAM, GPU, system), without sending anything over the network. Then import the file, or paste its content below: it is attached to the 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
)
No terminal: just fill in the fields below (at least the model).
Scenarios
Default scenarios: challenge targeted at ≈ 1 s (median, all cores, on the reference PC), 80 % of challenges within a factor ≤ 2 (p90/p10 ≤ 2). Parts set by the theory (p90/p10 ≤ 2 on 8 threads); calibrate the difficulties on the reference PC, then import them as is elsewhere. The maximum throughput measurement duration (dureeDebitMs) is still provisional.
JSON file pow-equix-wasm/banc-scenarios: dureeCibleMs (median targeted by calibration), dureeDebitMs (maximum throughput measurement), calibrage (reference machine), and scenarios: { id, libelle, algorithme (sha256, argon2id, equix), parametres, parts, difficulte, fils (“coeurs” by default), sansParallelisation, repetitions }. Difficulty: leading zero bits for SHA-256 and Argon2id, effort for Equi-X. Memory is tunable for Argon2id { memoireKio, iterations, parallelisme } as for Equi-X { n, compilation }. Threads are capped by the device memory (Argon2id, Equi-X).
Estimate
From reference durations, then from a speed measurement on this device. For each scenario: single challenges on all cores (latency), then maximum throughput (dureeDebitMs), then the verification bench (3 s per configuration, on 1 thread then on all cores). Each finished challenge is stored in this browser: after a crash, starting again resumes where the bench stopped (at most 3 attempts per scenario).
Reference machine
On the reference PC only, all cores: adjusts the difficulty of each scenario so that the median challenge reaches dureeCibleMs (1 s), parts following the theory (smallest number giving p90/p10 ≤ 2), with an informative check over 100 challenges, then freezes the result in the scenario file, to download and import as is on the other machines.
Progress
Results
Verification throughput
Valid parts verified per second (denial-of-service resistance), on 1 thread and on all cores.
Export
Complete file, schema pow-equix-wasm/banc version 1 (demo/banc/schema.ts), to aggregate with other devices: