OpenZeppelin ECRecovery не работает

Я пытаюсь использовать библиотеку OpenZeppelin ECRecovery для проекта, над которым работаю.

К сожалению, я не совсем понимаю, как это работает, и для этого нет документации.

Допустим, я хочу подписать сообщение «привет». Сначала я хеширую это:

msg = web3.sha3('hello');

Затем я подписываю его, используя web3.eth.sign и метамаску.

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

Возвращаемая подпись:

0xebb853cf9818c590e428bfa2b793b23e975d978bfefbb8aff164a282786c3eda0054113161b1a72f29f371a35b9a378413d689e49addcea34a8a617270c2bc951c

В коде библиотеки написано:

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

Поэтому, если я вызову функцию с хешем и приведенной выше подписью, она завершится ошибкой, потому что длина этой подписи равна 132.

Я также думал об использовании значения r или s подписи только путем разделения его в JavaScript: (хотя я даже не знаю, что представляют собой эти значения, так как в документации по солидности нет абсолютно никакой информации)

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

Но оба имеют длину 66 и тоже терпят неудачу.

Кто-нибудь когда-либо использовал их библиотеку и может мне помочь?

Вы можете получить более быструю помощь в их slack: slack.openzeppelin.org

Ответы (1)

Его длина составляет 132, но у вас есть 2 для префикса «0x», тогда у вас есть 130 шестнадцатеричных символов, которые представляют 130/2 = 65 байтов, как и ожидалось. Вы должны убедиться, что отправляете их в виде массива байтов.

Я не понимаю. Какое из значений (r или s) я должен отправить? Не могли бы вы написать пример кода на js?
Я попытался отправить это: "ebb853cf9818c590e428bfa2b793b23e975d978bfefbb8aff164a282786c3eda0054113161b1a72f29f371a35b9a378413d689e49addcea34a8a617270c2bc951", но это не работает.
Я понял... Я вручную прописал входные параметры и поставил подпись как bytes32. В этом была проблема. Спасибо.