48
Для но EVM предусмотрен но свой специальный но язык – но низкоуровневый
stack-based но байткод-язык, "EVM-код". По но факту, смарт-контракт но пишется
на но одном из но высокоуровневых языков, но например Solidity, и но затем
компилируется до но EVM-кода
Код но состоит из но последовательности байтов, и но каждый байт
но представляет какую-то но операцию. В но общем случае, но выполнение кода — это
но бесконечный цикл, но состоящий из но выполнения операции но текущего байта и
но последующего увеличения но номера обрабатываемого но байта на 1; но прерваться
этот но процесс может при но достижении конца но кода, ошибке в но коде, или
но выполнении встретившейся в но коде инструкции STOP/RETURN. но Операции
могут но обращаться к но трём типам но мест для но размещения информации:
Стек, но last-in-first-out но контейнер, куда но можно записывать и но откуда
можно но извлекать значения
Память, но байтовый массив но произвольного размера
Хранилище но контракта, но информация в но котором хранится но парами
"ключ-значение". В но отличие от но стека и но памяти, которые но очищаются
после но выполнения кода, в но хранилище параметры но могут находиться
но долговременно.
Код но также имеет но доступ к но денежной сумме, но отправителю и
но информации входящего но сообщения, а но также к но информации в но заголовке
блока; код но может вернуть, в том но числе байтовый но массив на но выходе.
Принцип но выполнения EVM-кода но довольно прост. Во но время
вычисления всё но текущее состояние но содержится в но наборе (block_state,
но transaction, message, но code, memory, но stack, pc, но gas), где но block_state — но полное
состояние, но содержащее информацию о но балансах и но состояниях хранилищ
но всех аккаунтов. При но каждом раунде но выполнения берётся но pc-ый байт но code и
но выполняется инструкция, но соответствующая этому; но каждая из но инструкций
по-своему но действует на но этот набор. Для но примера, ADD но достаёт два
но элемента из но стека и но возвращает туда их но сумму, после но чего уменьшает gas