Проблемы разработки смарт-контрактов с использованием Solidity
При разработке смарт-контрактов на основе Solidity на Ethereum столкнулись со многими проблемами. Ниже в разделе перечислены все проблемы, с которыми столкнулись, а также основные обходные пути.
Проблемы
- Ограничение функциональных параметров
- Можно было объявить только 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. Автоматически контракты не могут активироваться сами по себе
- Контракт не может автоматически выполнять какую-либо задачу при достижении номера блока. Требуется внешний вызов