Подписание и проверка сообщений в Ethereum - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь следовать этому учебнику здесь :

Но в уроке он не указывает, как выполнить контракт. Поэтому я попытался сделать это, используя трюфель и ганаш-кли. В тесте трюфеля я попытался использовать следующий код:

const amount = web3.toWei(5, 'ether');
const Contract = await GmsPay.new({from : Sender, value : web3.toWei(10, 'ether')});
const hash = Web3Beta.utils.soliditySha3(
    {t : 'address', v : Recipient},
    {t : 'uint256', v : amount},
    {t : 'uint256', v : 1},
    {t : 'address', v : Contract.address}
);
const sig = await Web3Beta.eth.sign(hash, Sender);
const res = await Contract.claimPayment(amount, 1, sig, {from : Recipient});

Но я продолжаю получать сообщение: «Ошибка: исключение виртуальной машины при обработке транзакции: возврат». Используя отладчик, я вижу, что мой код выполняется до:

require(recoverSigner(message, sig) == owner);

Даже если я вычеркну эту строку, последняя строка все равно не работает. Что я делаю неправильно? Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 19 февраля 2019

В моих тестах на трюфели встречались схожие проблемы с проверкой «recoverSigner (message, sig) == owner». После сравнения значений R, S, V, полученных в функции solidness recoverSigner (), с теми же значениями, сгенерированными на тестовой стороне с помощью функции ethereumjs-util's fromRpcSig (), я понял, что recoverSigner возвращает V как 0, тогда как изRpcSig имеет значение 27. Эта строка предоставила рабочий ответ.

Последняя функция splitSignature () включена ниже, если вы столкнулись с подобной проблемой.

function splitSignature(bytes memory sig)
        internal
        pure
        returns (uint8, bytes32, bytes32)
    {
        require(sig.length == 65);

        bytes32 r;
        bytes32 s;
        uint8 v;

        assembly {
            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }

        // support both versions of `eth_sign` responses
        if (v < 27) 
            v += 27;

        return (v, r, s);
    }
...