Есть ли ограничение на количество возвращаемых значений из функций Solidity?

Ответ на этот вопрос ( https://ethereum.stackexchange.com/a/3590/4575 ) говорит, что: «Мне пока не разрешено возвращать динамические массивы из функций Solidity».

С другой стороны, Solidity поддерживает функции с несколькими возвращаемыми значениями. Как я могу вернуть несколько строк из функции контракта?

[В] Есть ли ограничение на количество возвращаемых значений в одном вызове функции. Например, могу ли я вернуть N (например, N=1000) значений или даже больше за один вызов функции?

function getData() constant returns (bytes32, bytes32, bytes32, bytes32, 
                                     bytes32, bytes32, bytes32, ...) {
    bytes32 a = "a";
    bytes32 b = "b";
    bytes32 c = "c";
    bytes32 d = "d";
    bytes32 e = "e";
    bytes32 f = "f";
    bytes32 g = "g";
    return (a, b, c, d, e, f, g, ...);
}

Спасибо за ваше драгоценное время и помощь.

Ответы (2)

На практике стек вызовов накладывает ограничения в текущих реализациях.

Следующий контракт столкнется с ошибкой компилятора «Слишком глубокий стек».

pragma solidity ^0.4.3;

contract Test {
    function getData() constant returns (bytes32, bytes32, bytes32, bytes32,
                                     bytes32, bytes32, bytes32, bytes32,
                                     bytes32, bytes32, bytes32, bytes32,
                                     bytes32, bytes32, bytes32) {                                         

        return ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o");                                         
    }
}

Надежность браузера:

https://ethereum.github.io/browser-solidity/#gist=ac9812a045a41fd4168f2e352732962d

Основной URL:

https://gist.github.com/anonymous/ac9812a045a41fd4168f2e352732962d

Согласно грамматике Solidity количество возвращаемых значений бесконечно:

FunctionDefinition = 'function' Identifier? ParameterList
                     ( FunctionCall | Identifier | 'constant' | 'external' | 'public' | 'internal' | 'private' )*
                     ( 'returns' ParameterList )? Block
[...]

ParameterList = '(' ( TypeName Identifier? (',' TypeName Identifier?)* )? ')'

Это показано с помощью *in (',' TypeName Identifier?)*which означает 1..infitintyв грамматической записи.
Конечно, возможности компьютеров накладывают на это некоторые естественные ограничения, которые можно исследовать только эмпирически.