Solidity vs FunC
Введение
В разработке смарт-контрактов используют языки вроде Solidity для Ethereum и FunC для TON. Solidity — это объектно-ориентированный язык высокого уровня со строгой типизацией, отчасти вдохновлённый C++, Python и JavaScript. Он спроектирован именно для разработки смарт-контрактов, которые выполняются на блокчейн-платформе Ethereum.
FunC также является языком высокого уровня, используемым для программирования смарт-контрактов на блокчейне TON. Он объектно-ориентированный, C-подобный, статически типизированный.
В следующих разделах кратко проанализируем различные аспекты этих языков: типы данных, хранилища, функции, структуры управления потоком, словари (hashmaps).
Различия Solidity и FunC
Схема хранения
Solidity
Solidity обеспечивает плоскую модель хранения: это значит, что все переменные состояния хранятся в едином непрерывном блоке памяти, его называют хранилищем. Там всё хранится в формате «ключ-значение», где каждый ключ является 256-битным целым числом, представляющим собой номер ячейки хранения, а каждое значение — это 256-битное слово, хранящееся в этой ячейке. Ячейки нумеруются последовательно, начиная с нуля, и в каждой из них может храниться только одно слово. Solidity позволяет разработчику сформировать структуру хранилища, используя ключевое слово «storage» для определения переменных состояния. Порядок, в котором задаются переменные, определяет их положение в хранилище.
FunC
Данные постоянного хранилища в блокчейне TON хранятся в виде ячеек. Ячейки играют роль памяти в стековой TVM. Чтобы прочитать данные из ячейки, надо преобразовать её в тип slice, а затем получить биты данных и ссылки на другие ячейки, считывая их из этого «слайса». Для записи данных надо сохранить биты данных и необходимые ссылки на другие ячейки в объект типа builder, а затем создать из этого builder новую ячейку.