WASM
Контрактный поддон WASM
Веб-сборка (Wasm)
WebAssembly используется в Polkadot, Substrate и Edgeware в качестве цели компиляции для среды выполнения.
Что такое WebAssembly?
WebAssembly, сокращенно Wasm, представляет собой двоичный формат инструкций для виртуальной машины на основе стека. Wasm разработан как переносимая цель для компиляции языков высокого уровня, таких как C/C++/Rust, что позволяет развертывать в Интернете клиентские и серверные приложения.
Почему WebAssembly?
WebAssembly — это двоичный формат, не зависящий от платформы, что означает, что он будет выполнять одни и те же инструкции на любой машине, на которой он работает. Блокчейнам нужна определенность, чтобы иметь надежные обновления перехода состояний на всех узлах в одноранговой сети, не заставляя каждый узел использовать одно и то же оборудование. Wasm хорошо подходит для надежности среди возможно разнообразного набора машин. Wasm эффективен и быстр. Эффективность означает, что он может быть загружен в цепочку как блок кода, не вызывая слишком большого раздувания состояния, сохраняя при этом способность выполняться на скорости, близкой к исходной.
Поддон контрактов
Палитра контрактов предоставляет среде выполнения возможность развертывать и выполнять смарт-контракты WebAssembly (Wasm).
Васм Двигатель
Палитра контрактов зависит от интерфейса песочницы Wasm, определяющего механизм выполнения Wasm, доступный в среде выполнения. В настоящее время это реализовано с помощью wasmi, интерпретатора Wasm.
Функции
Модуль «Контракты» имеет ряд знакомых и новых функций для развертывания и выполнения смарт-контрактов.
На основе аккаунта
Модуль «Контракты» использует систему на основе учетной записи, аналогичную многим существующим платформам смарт-контрактов. Для среды выполнения Substrate контрактные учетные записи ничем не отличаются от обычных учетных записей пользователей; однако в дополнение к AccountID и Балансу, которые есть у обычных учетных записей, учетная запись контракта также имеет связанный код контракта и некоторое постоянное хранилище контрактов.
Двухэтапное развертывание
Развертывание контракта с помощью модуля «Контракты» выполняется в два этапа:
Сохраните контракт Wasm в блокчейне.
Создайте новую учетную запись с новым хранилищем, связанным с этим контрактом Wasm. Это означает, что несколько экземпляров контрактов с разными аргументами конструктора могут быть инициализированы с использованием одного и того же кода Wasm, что уменьшает объем памяти, необходимый модулю контрактов в вашей цепочке блоков.
Типы среды выполнения
Для написания контрактов и взаимодействия со средой выполнения доступен набор типов (например, AccountId, Balance, Hash, Moment). Эти типы могут быть определены пользователем для пользовательских сред выполнения или могут использоваться предоставленные значения по умолчанию.
Контрактные вызовы
Вызовы контрактов могут изменять хранилище контракта, создавать новые контракты и вызывать другие контракты. Поскольку Substrate предоставляет вам возможность писать собственные модули среды выполнения, модуль Contracts также позволяет выполнять асинхронные вызовы непосредственно к этим функциям среды выполнения от имени учетной записи контракта.
Песочница
Модуль «Контракты» предназначен для использования любым пользователем общедоступной сети. Это означает, что контракты имеют возможность напрямую изменять только свое собственное хранилище. Чтобы обеспечить безопасность базового состояния блокчейна, модуль Contracts включает обратимые транзакции, которые откатывают любые изменения в хранилище вызовами контрактов, которые не завершились успешно.
Газ
За вызовы по контракту взимается плата за газ, чтобы ограничить количество вычислительных ресурсов, которые может использовать транзакция. При формировании договорной сделки указывается лимит газа. По мере исполнения контракта газ постепенно расходуется в зависимости от сложности вычислений. Если лимит газа будет достигнут до завершения выполнения контракта, транзакция завершится неудачно, хранилище контракта будет возвращено, а плата за газ не будет возвращена пользователю. Если исполнение контракта завершается с оставшимся газом, излишки возвращаются пользователю в конце транзакции.
Модуль «Контракты» определяет цену газа, которая представляет собой конвертацию валюты субстрата в одну единицу газа. Таким образом, для выполнения транзакции у пользователя должен быть свободный баланс не ниже цены газа * лимита газа, который можно потратить.
Аренда склада
Подобно тому, как газ ограничивает количество вычислительных ресурсов, которые могут быть использованы во время транзакции, аренда хранилища ограничивает площадь, которую контракт может иметь в хранилище блокчейна. С контрактной учетной записи взимается плата пропорционально объему хранилища, используемому этой учетной записью. Когда баланс контракта становится ниже определенного предела, учетная запись контракта превращается в «надгробие», а его хранилище очищается. Контракт с захоронением можно восстановить, предоставив данные, которые были очищены, когда он стал захоронением, а также любые дополнительные средства, необходимые для поддержания контракта в силе.
Модуль контрактов и EVM
Модуль «Контракты» повторяет существующие идеи в экосистеме смарт-контрактов, в частности Ethereum и EVM.
Наиболее очевидное различие между модулем Contracts и EVM заключается в основном механизме выполнения, используемом для запуска смарт-контрактов. EVM — хорошая теоретическая среда выполнения, но ее не очень удобно использовать на современном оборудовании. Например, манипулирование 256-битными целыми числами в современных архитектурах значительно сложнее, чем стандартные типы. Даже команда Ethereum исследовала использование Wasm для сети следующего поколения.
EVM взимает плату за хранение только во время хранения. Эти единовременные затраты приводят к тому, что некоторый постоянный объем хранилища используется в блокчейне навсегда, что экономически нецелесообразно. Модуль «Контракты» пытается исправить это с помощью аренды хранилища, что гарантирует, что любые данные, которые сохраняются в блокчейне, должным образом оплачиваются эти ресурсы.
Модуль «Контракты» выбирает подход к созданию контракта с использованием двухэтапного процесса, что коренным образом меняет способ контракты хранятся в цепочке. Адреса контрактов, их хранилище и балансы теперь отделены от основной логики контрактов. Это может обеспечить поведение, подобное тому, которое create2 предоставило Ethereum, или даже включить восстанавливаемые или обновляемые контракты в блокчейне на основе субстрата.
Ресурсы
- WebAssembly.org - домашняя страница WebAssembly, содержащая ссылку на спецификацию.
- Wasmi - интерпретатор WebAssembly, написанный на Rust. — Parity Wasm — сериализация/десериализация WebAssembly в Rust.
- Утилиты Wasm - Коллекция утилит Wasm, используемых при разработке контрактов Parity и Wasm.
- Pallet-contracts - Модуль Contract предоставляет функциональные возможности среды выполнения для развертывания и выполнения смарт-контрактов WebAssembly.
- Поддон контрактов