Проблемы разработки смарт-контрактов с использованием Solidity

При разработке смарт-контрактов на основе Solidity на Ethereum столкнулись со многими проблемами. Ниже в разделе перечислены все проблемы, с которыми столкнулись, а также основные обходные пути.

Проблемы

  1. Ограничение функциональных параметров
  • Можно было объявить только 16 переменных, которые включают в себя параметры метода и возвращаемые переменные, в противном случае возникает ошибка «Stack Too Deep Exception».
  • Обходной путь — разбить функцию на несколько. При необходимости перейдите, используя глобальные переменные

2. Внешние методы не могут иметь массивы строк

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

3. Внешние методы не могут возвращать значения типа «структура».

  • Для этого нужно вернуть несколько значений в операторе return.

4. Массивы памяти переменной длины требуют нового ключевого слова

  • Нужно использовать новое ключевое слово для инициализации массива памяти
  • Также нельзя изменить размер массива на основе локальной памяти, в то время как то же самое можно сделать с глобальными массивами хранения.

5. Обнаружены пробелы при удалении индексов массива

  • Если удалить значение нижнего индекса массива, то необходимо вручную сместить элементы в массиве и соответственно обновить свойство длины.

6. Нет свойства длины для строкового типа

  • Для строковых типов нет метода или атрибута длины для определения длины строки. Поэтому нужно сначала преобразовать строку в байты, а затем использовать атрибут длины байтов, чтобы определить ее.

7. Сравнение строк невозможно напрямую

  • Прямое сравнение строковых значений не поддерживается. Для этого можно преобразовать строковые значения в хэши SHA3 и сравнить их.

8. Объявление локального массива может переопределить хранилище

  • При объявлении локального массива, если ключевое слово new не используется, то оно по умолчанию указывает на первый атрибут хранилища и при изменении обновляет то же самое.

9. Область действия блока не применяется

  • Даже если переменная может быть объявлена ​​​​внутри, позволяет цикл for функции, но она будет конфликтовать с переменной, объявленной в другом блоке с тем же именем.

10. Усечение целых чисел, если они не подходят

  • Если результат операции не укладывается в диапазон, то усекается
  • Перед изменением состояния следует выполнять утверждения

11. Примитивные типы данных, инициализированные значениями по умолчанию

  • Нет возможности присваивать нулевые значения по умолчанию примитивным типам данных.

12. События могут иметь только три параметра для поиска

  • При объявлении событий необходимо применить ключевое слово index, чтобы указать, возможен ли поиск в этом поле.
  • Максимально можно было проиндексировать только три поля.

13. Имена возвращаемых параметров метода могут конфликтовать с хранилищем.

  • Если имя возвращаемого параметра совпадает с именем глобальной переменной, то при применении данных к возвращаемой переменной может измениться состояние глобальной переменной.

14. Следующие преобразования типов данных не поддерживаются напрямую

  • Байты в строку — для выполнения того же требуется ручное преобразование
  • Адрес в строку — для выполнения того же требуется ручное преобразование путем преобразования в байты.
  • Байты для адреса — для выполнения того же требуется ручное преобразование путем преобразования каждого байта в uint160.

15. Внешняя функция для использования платного модификатора для получения эфира

  • Если модификатор payable не применяется к методу, транзакция отклоняется.

16. Автоматически контракты не могут активироваться сами по себе

  • Контракт не может автоматически выполнять какую-либо задачу при достижении номера блока. Требуется внешний вызов