OpenZeppelin ECRecovery no funciona

Estoy tratando de usar la biblioteca OpenZeppelin ECRecovery para un proyecto en el que estoy trabajando.

Desafortunadamente, no entiendo completamente cómo funciona y no hay documentación para ello.

Digamos que quiero firmar el mensaje 'hola'. Primero lo hago hash:

msg = web3.sha3('hello');

Luego lo firmo usando web3.eth.sign y metamask.

web3.eth.sign(web3.eth.accounts[0], msg, (err, res) => {
    sig = res;
})

La firma devuelta es:

0xebb853cf9818c590e428bfa2b793b23e975d978bfefbb8aff164a282786c3eda0054113161b1a72f29f371a35b9a378413d689e49addcea34a8a617270c2bc951c

En el código de la biblioteca dice:

// Check the signature length
if (sig.length != 65) {
  return (address(0));
}

Entonces, si llamo a la función con el hash y la firma anterior, fallará porque esta firma tiene una longitud de 132.

También pensé en usar el valor r o s de la firma solo dividiéndolo en JavaScript: (aunque ni siquiera sé qué representan estos valores, ya que no hay absolutamente ninguna información en la documentación de solidez)

var r = sig.substr(0,66);
var s = "0x" + sig.substr(66,64);

Pero ambos tienen una longitud de 66 y también fallan.

¿Alguien ha usado alguna vez su biblioteca y me puede ayudar?

Puede obtener ayuda más rápida en su holgura: slack.openzeppelin.org

Respuestas (1)

Su longitud es 132 pero tiene 2 para el prefijo '0x', entonces tiene 130 caracteres hexadecimales que representan 130/2 = 65 bytes como se esperaba. Debe asegurarse de enviarlos como una matriz de bytes.

No entiendo. ¿Cuál de los valores (r o s) debo enviar? ¿Podría escribir un código de ejemplo en js?
Intenté enviar esto: "ebb853cf9818c590e428bfa2b793b23e975d978bfefbb8aff164a282786c3eda0054113161b1a72f29f371a35b9a378413d689e49addcea34a8a617270c2bc951c", pero no funciona.
Lo tengo... Escribí manualmente los parámetros de entrada y establecí la firma como bytes32. Ese era el problema. Gracias.