R3E Network reveals Neo Solidity compiler project for Neo N3
R3E Network представляет проект Neo Solidity Compiler для Neo N3
Джимми Ляо, основной разработчик и основатель R3E Network, объявил о работе над Neo Solidity Compiler, инструментом, который компилирует смарт-контракты Solidity версии 0.8.x в байт-код Neo N3. Этот проект позволяет разработчикам писать контракты на Solidity и развертывать их в блокчейне Neo N3.
Что такое Neo Solidity?
Neo Solidity Compiler преобразует смарт-контракты Solidity в байт-код и манифестные файлы, совместимые с Neo N3. Компилятор написан в основном на Rust и включает в себя инфраструктуру тестирования для базовых и продвинутых функций Solidity. Документация проекта указывает, что его цель — предоставить разработчикам Ethereum возможность создавать приложения на Neo N3, используя свои существующие знания Solidity, а не изучая нативные языки смарт-контрактов Neo.
Компилятор принимает исходный код Solidity версии 0.8.x и генерирует файлы байт-кода .nef и манифестные файлы .manifest.json, совместимые с Neo N3. Он обнаруживает шаблоны стандартов ERC (ERC-20, ERC-721) в смарт-контрактах Solidity и сопоставляет их с эквивалентными стандартами Neo (NEP-17, NEP-11).
При компиляции контрактов разработчики могут выбирать один из четырех уровней оптимизации (0-3). Инструмент работает через интерфейс командной строки и включает в себя шаблоны для интеграции с Hardhat и Foundry, двумя популярными фреймворками разработки, используемыми в разработке Ethereum.
Neo Solidity отличается от проекта Neo X тем, что Neo X — это EVM-сайдчейн, где разработчики развертывают смарт-контракты Solidity напрямую в этой сети без изменений. В отличие от этого, Neo Solidity компилирует исходный код Solidity в байт-код, совместимый с Neo N3, что позволяет развертывать контракты непосредственно в основной сети Neo N3, а не в отдельной EVM-совместимой цепочке.
Техническая архитектура
Процесс компиляции преобразует исходный код Solidity в промежуточное представление Yul, а затем выполняет семантический анализ для проверки типов и валидации. Многоуровневый оптимизатор применяет преобразования, специфичные для Neo, перед тем, как генератор кода создаст байт-код NeoVM и манифестные файлы.
Компилятор включает в себя библиотеку времени выполнения, которая предоставляет управление памятью, операции хранения, кодирование ABI и криптографические функции, разработанные для соответствия поведению EVM в среде выполнения Neo.
Подробные технические спецификации доступны в репозитории проекта для разработчиков, заинтересованных в внутренней архитектуре и решениях по реализации компилятора.
Примеры контрактов
В репозитории представлены несколько примеров контрактов, демонстрирующих функциональность компилятора. WGAS — это реализация токена, обернутого в GAS, которая соответствует шаблону WETH9 и соответствует стандарту NEP-17. FlashLoan реализует пул мгновенных кредитов в стиле Aave V2 с комиссией 0,09%. SimpleAMM — это автоматизированный маркет-мейкер с постоянным произведением, основанный на дизайне Uniswap V2.
Дополнительные примеры включают TokenVesting, который предоставляет линейные графики распределения токенов, аналогичные VestingWallet от OpenZeppelin; SimpleLending, который адаптирует механику пула кредитования с одним активом от Compound; и SimpleDAO, который реализует систему управления в стиле MolochDAO с использованием стейкинга и предложений.
Согласно документации проекта, все примеры контрактов были развернуты и протестированы с операциями, изменяющими состояние, в Neo Express, локальной среде разработки Neo.
Статус разработки
Документация проекта указывает, что основной компилятор завершен примерно на 85% и описан как готовый к производственному использованию. Библиотека времени выполнения находится на стадии завершения на 75%, инструменты для разработчиков – на 70%, с полностью функциональным интерфейсом командной строки, а документация – на 80%.
В документации проекта перечислены несколько текущих ограничений. Частично поддерживается перегрузка функций: функции можно перегружать с использованием разных наборов аргументов с использованием "измененных" имен, но перегрузка с одинаковым набором аргументов запрещена. Опции вызова EVM, такие как {gas: ...} и {value: 0}, принимаются, но игнорируются; для передачи ненулевых значений необходимо использовать нативные вызовы NEP-17. Расчет газа осуществляется приблизительно с использованием подсказок о потреблении газа для каждого системного вызова, при этом точность платы на уровне операций составляет примерно 80%.
В документации рекомендуется проводить тестирование в TestNet перед развертыванием в MainNet.
Техническое описание проекта можно найти здесь, а репозиторий проекта – по ссылке ниже: