Este artículo relata los problemas técnicos que el autor, desarrollador del proyecto Anubis, tuvo que resolver para integrar comprobaciones de prueba de trabajo basadas en WebAssembly con fallback a JavaScript puro. La idea es definir la lógica de comprobación una sola vez y compilarla a JavaScript mediante la herramienta wasm2js del proyecto Binaryen, de modo que los usuarios con WebAssembly desactivado en el navegador puedan seguir accediendo a los sitios protegidos.
Para que los builds fueran confiables, el autor necesitaba compilaciones reproducibles bit a bit, algo más difícil de lo que parece en C y C++. El primer obstáculo es que las macros DATE y TIME hacen que cada compilación produzca un binario distinto aunque el código fuente sea idéntico. El segundo es que Clang invoca silenciosamente a wasm-opt desde el PATH, y las versiones antiguas que empaquetan las distribuciones de Linux no soportan la extensión de excepciones de WebAssembly, lo que rompe la compilación en arquitecturas como ARM. La solución pasa por pasar el flag --no-wasm-opt en el enlace.
El tercer problema, más sutil, es que Clang genera código dependiente de la disposición de memoria: punteros sin procesar se filtran al orden de los bloques try_table en el manejo de excepciones, lo que provoca que cada compilación difiera de la anterior en unos 29 bytes. El artículo muestra los volcados hexadecimales y el desensamblado parcial que evidencian la divergencia, y deja entrever que la solución definitiva requirió ingeniería adicional más allá de lo que se detalla en el texto.
