# запуск EVM1 в контракте EOS-VM
## Контекст
Для создания абстракции учетной записи во втором слое нужно запустить EVM1[^EVM1] в контексте **сервис воркера платежного хендлера браузера**(тестовый стенд [тут](https://santalov.github.io/demo/), подробнее [тут](https://santalov.github.io/), код [тут](https://github.com/Santalov/Santalov.github.io)).
Структура транзакции любого блокчейна - бинарный код вызова метода контракта и приложенная к нему ЭЦП(подробнее про [Эфирную транзакцию](https://lsongnotes.wordpress.com/2017/12/21/ethereum-transaction-structure/), [транзакцию EOS](https://steemit.com/eos/@dan/eos-developer-s-log-stardate-201707-9) - важное отличие, процесс авторизации в EVM1 и EOS-VM координально отличаются/в данном контексте не важно, но знать полезно/)
**Контракт `EVM1`** - запускаеммый в виртуальной машине класс контракта, имеющий собственный адрес и персистентную память. Выглядит как JSON файл, содержащий описание интерфейса методов контракта, а также описание его атрибутов. Пример исходного кода, abi интерфейса и скомпилированной версии можно глянуть [тут(ERC20 токен USDT)](https://github.com/keylessone/stan_mono/tree/tether/svm/contracts). **IDE** для быстрой компиляции контрактов: https://remix.ethereum.org/ . Пожробное описание EVM1 [тут](https://github.com/ethereumbook/ethereumbook/blob/develop/13evm.asciidoc)
**Контракт `EOS-VM`** - WASM файл, запускаемый в контексте `WASM-VM` скомпилированный образ контракта, наследующего интерфейс `EOSIO.TOKEN` и ряда системных контрактов, заданных `EOS.IO`, `*.abi` файл специализирующий его интерфейс и опционально `*.md` файл описывающий функционал контракта в человекочитаемой форме(называется рикардиан контракт). Пример скомпилированного контракта(эмулирующего стековую машину `EVM1`) и интерфейса к нему [тут](https://github.com/jafri/eosio.evm/tree/master/eos-evm-js/src/eos-contracts). **IDE** для быстрой компиляции и деплоя контрактов: https://www.eosstudio.io/

> подробнее про устройство EOS-VM [тут](https://arxiv.org/pdf/1906.10362.pdf) и [тут](https://klevoya.com/blog/overview-of-the-eosio-webassembly-virtual-machine/)
Используя [vagrantup](https://www.vagrantup.com/) я смог собрать контракт виртуальной машины evm1 для запуска в контексте wasm:

Как упомянуто выше в открытом доступе есть проект эмуляции виртуальной машины EVM1 для запуска в `EOS-VM` : https://github.com/jafri/eosio.evm
## Задача
Запустить скомпилированную в WASM `EVM1` в контексте сервис-воркера, задеплоить в нее базовый `ERC-20` контракт(при деплое вызывается конструктор в котором объявляется сумма эмисии токена, которая становится доступной учетной записи, подписавшей вызов `EVM1`, деплоющий контракт в `EVM1`), вызвать метод `transferTO` контракта erc20, отправить часть эмисии на адрес `0xB1A4283662b43d40e7b4BF47d39a3Fb7dF0AE0d0`. Весь перечень данных операций производится силами **[eos-evm-js](https://github.com/jafri/eosio.evm/tree/master/eos-evm-js)** и описан в примере, единственное отличие - в примере исполнение происходит не в контексте браузера, а в контексте ноды тестовой сети `EOS-IO`.
## Внешние ссылки
https://developer.mozilla.org/en-US/docs/WebAssembly/Loading_and_running
[^EVM1]: Ethereum Virtual Michine - стековая виртуальная машина.