Динамическое количество входных данных для смарт-контракта

Предположим, что мы являемся интеллектуальным контрактом, который принимает несколько криптографически подписанных атрибутов. Умный контракт будет проверять каждую подпись и проверять соответствие всех адресов подписанных подписей. Умный контракт должен иметь возможность взять минимум две подписи и максимум десять подписей. Как создать интеллектуальный контракт, который позволяет пользователю вводить динамическое количество атрибутов? Возможно ли это?

Следующий код работает для одной сигнатуры и возвращает адрес подписавшего:

pragma solidity ^0.4.8;

contract test {

    function recoverAddr(bytes32 msgHash, uint8 v, bytes32 r, bytes32 s) constant returns (address) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = sha3(prefix, msgHash);
        address signer = ecrecover(prefixedHash, v, r, s);
        return signer;
    }
}

Я хочу добавить к этому, чтобы он мог принять n подписанных msgHash (учитывая, что иногда пользователь может ввести не менее двух и других случаев, когда пользователь может ввести больше атрибутов, до максимально допустимого числа, 10 в этом случае) , Затем, если все адреса совпадают, мы возвращаем адрес.

3 голоса | спросил Fawzy3881 29 MarpmThu, 29 Mar 2018 19:41:09 +03002018-03-29T19:41:09+03:0007 2018, 19:41:09

2 ответа


2

Вы можете передавать массивы динамического размера в функцию и цикл. Например:.

pragma solidity ^0.4.21;

contract Test {
    ...

    function check(bytes32[] msgHash, uint8[] v, bytes32[] r, bytes32[] s) public view returns (bool) {
        for (uint256 i = 0; i < msgHash.length; i++) {
            address signer = recoverAddr(msgHash[i], v[i], r[i], s[i]);
            ...
        }
    }
}
ответил smarx 29 MarpmThu, 29 Mar 2018 20:26:28 +03002018-03-29T20:26:28+03:0008 2018, 20:26:28
0

Вы можете сделать это, используя перегрузку или использовать только одну функцию и проверить значение, если оно было передано в функции.

    функция callMe (uint one) public pure return (uint sum) {
        вернуть один;
    }

    функция callMe (uint one, uint two) public pure return (uint sum) {
        return callMe (один) + два;
    }

в этом случае вы перегружаете функцию для определения дополнительного параметра. Другой способ - использовать одну функцию и условно проверить параметры

    функция callMe (uint one, uint two) public pure return (uint sum) {
        //значение по умолчанию для параметров равно нулю, и если это означает, что это не было передано
        если (2> 0) {
            return one + (two * 2);
        }

        вернуть один;
    }

, если вы вызовете эту функцию без второго параметра внутри контракта, поступит как ноль, и вы можете проверить его на значение по умолчанию, чтобы определить, было ли оно получено.

Вызов этой функции без одного параметра или даже без параметров является законным (с использованием ремикса). И я думаю, что это будет то же самое через javascript /web3 (который используется ремиксом). Возможно, это проблема с другой реализацией web3. И определенно вы не можете вызвать функцию без параметра в Solidity.

ответил mirg 29 MarpmThu, 29 Mar 2018 20:02:37 +03002018-03-29T20:02:37+03:0008 2018, 20:02:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132