VM
Мы считаем, что хорошая реализация виртуальной машины должна быть элегантной, простой в использовании и надежной. Сравнив плюсы и минусы EVM, EOS, C Lua и V8, мы принципиально разрешили необоснованные конструкции из EVM и EOS. Нам удалось создать IOST VM на основе V8 из-за ее высокой производительности в Chrome.
1. Структура и дизайн IOST V8VM
VMManager находится в ядре V8VM. Он имеет три основные функции:
- VM Вход. Он связывает внешние запросы с другими модулями, включая запросы RPC, валидацию блока, валидацию Tx и т.д. Работа передается VMWorker после предварительной обработки и форматирования.
- VMWorker управление жизненным циклом. Число workers(рабочих процессов) устанавливается динамически на основе нагрузки системы. Это позволяет повторно использовать workers(рабочие процессы). Внутри workers(рабочих процессов) JavaScript производит запуск (hot launch) и согласованность моментальных снимков в виде «горячих точек» (Sandbox) помогают сократить частое создание виртуальных машин и избежать большой нагрузки на процессор и память при загрузке одного и того же кода. Это увеличит пропускную способность системы, позволяя IOST V8VM свободно работать даже при обработке контрактов с массивной пользовательской базой, например fomo3D.
- Управление интерфейсом с базой данных State(Management of interface with State database). Это обеспечивает атомарность каждой транзакции IOST, аннулируя транзакцию, когда возникает ошибка с недостатком средств. В то же время двухуровневый кеш достигается в базе данных State, прежде чем его можно сбросить до RocksDB.
2. Конструкция ядра Sandbox
В качестве полезной нагрузки для исполнения смарт-контракта JavaScript Sandbox взаимодействует с V8VM и упаковывает вызов для Chrome V8. Существует два этапа: компиляция и выполнение.
Этап компиляции
В основном для разработки и публикации смарт-контрактов он имеет две функции::
- Упаковка контракта. Упаковка смарт-контрактов с помощью webpack. Webpack упаковывает все исходные коды javascript в проект и устанавливает все зависимости, делая IOST V8VM простым для разработки больших проектов. Кроме того, IOST V8VM обладает практически всеми функциями Node.js, что позволяет разработчикам чувствовать себя в знакомой среде.
- Снимок контракта. Благодаря технологии моментальных снимков компиляция повышает производительность создания изолированной среды и контекста — антисериализация моментального снимка даст возможность достигать результата одновременно с выполнением и значительно увеличит скорость загрузки и выполнения JavaScript.
Этап выполнения
В основном для выполнения контрактов в блокчейне он также имеет две функции:
- Загрузка виртуальной машины (LoadVM). Завершает инициализацию виртуальной машины, включая создание объекта Chrome V8, настройку параметров выполнения системы, импорт соответствующих библиотек классов JavaScript и т.д. Некоторые библиотеки классов JavaScript включают:
Class Library | Features |
---|---|
Blockchain | Node.js-как модульная система, включая кэширование модулей, предварительную компиляцию, циклические вызовы и т. д. |
Event | Чтение / запись JavaScript с помощью библиотеки State и откат, когда контракты сталкиваются с ошибками. |
NativeModule | Функции связанные с блокчейном, включая transfer(перечисление), withdraw(вывод) и получение информации о текущем блоке и Tx(транзакции). |
Storage | Реализация событий. Внутренние события JavaScript-контрактов могут принимать обратные вызовы после перехода по цепочке. |
- Выполнение. Окончательное выполнение JavaScript смарт-контракта. IOST V8VM будет запускать контракт на автономном потоке, контролировать состояние прогона, и будет
Terminate
(Завершать) текущий запуск при возникновении ошибки, недостатке ресурсов, или истечении времени, и возвращать аномальные результаты.