Примеры ограничений функций?

Я кодировал разные функции и не нашел стандарта, четко определяющего, сколько переменных вы можете использовать (поля, локальные или как параметры модификаторов внутри этой функции?

Вы знаете шпаргалку с этими ограничениями?

Спасибо!

Ответы (1)

Я не знаю ни одной шпаргалки, и проблема в том, что Solidity проверяет размер локального стека в нескольких разных местах во время вызова функции, но выдает одно и то же сообщение об ошибке, поэтому в зависимости от того, как вы комбинируете аргументы функции, переменные, объявленные внутри функционального блока и возвращаемые значения, иногда появляется сообщение об ошибке «Стек вглубь, попробуйте удалить локальные переменные». например:

      f (uint a, uint b, uint c, uint d, string e, string f, string g, string h) 
returns (uint, uint, uint, uint, string, string, string, string) { 

        return (a,b,c,d,e,f,g,h);
        }

работает, но:

      f (uint a, uint b, uint c, uint d, string e, string f, string g) 
returns (uint, uint, uint, uint, string, string, string, string, string) { 

        return (a,b,c,d,e,f,g,g,g);
    }

выдает: «CompilerError: Stack to deep, попробуйте удалить локальные переменные».

(Во втором я удалил аргумент функции строки типа и добавил его к возвращаемым значениям).

Даже если вы (по какой-то причине) предполагаете, что возвращаемое значение типа «строковая память» занимает два слота для хранения, первый пример также не должен был работать (8 входных параметров + 4 однослотовых возвращаемых значения + 4 двухслотовых возврата). значения = 20 слотов стека). Так что я считаю, что в Solidity есть над чем поработать?

А вообще, из того, что я читал:

  • Все аргументы функции занимают один слот
  • Любая другая переменная, объявленная внутри функции или возвращаемая функцией, занимает один слот, если она находится в памяти, и два слота, если она является ссылкой на хранилище.

Вместе у вас не может быть больше 16.

Как я упоминал ранее, кажется, что есть крайние случаи, подобные приведенному выше, но это обычно работает. Я знаю, что это не дает четкого ответа на ваш вопрос, но я надеюсь, что кто-то еще сможет уточнить!

РЕДАКТИРОВАТЬ: Предполагая, что вы говорите здесь о локальных переменных, переменные в хранилище не имеют этих ограничений, поскольку причиной максимального количества локальных переменных 16 является максимальный размер стека 1024 слота - ничего общего с переменными состояния.