Мы можем внести несколько ключевых изменений в наш стековый код из предыдущего поста, чтобы собрать ZKVM, соответствующий спецификации, описанной выше.
- Мы удалили опкод POP, поскольку он больше не нужен;
- Мы добавили опкоды ADD и MUL;
Вспомните, что предыдущие правила копирования предыдущего стека были следующими:
- A. Если sp равен 1 или больше, а столбец j находится на 1 индекс ниже sp, и текущая инструкция - PUSH или NOP, мы должны скопировать столбец j;
- B. Если sp равно 2 или больше, и столбец j находится на 2 индекса ниже sp, а текущая инструкция - POP, мы должны скопировать столбец j;
Правило A остается неизменным, а вот B нужно обновить следующим образом:
- B. Если sp равно 2 или больше, а столбец j находится на 3 индекса ниже sp, и текущая инструкция - ADD или MUL, мы должны скопировать столбец j;
Причина этого изменения в том, что предыдущая инструкция POP не изменяла второй по счету элемент стека, а только удаляла верхний. Однако ADD дважды открывает стек и выводит сумму. Аналогично, MUL дважды открывает стек и вставляет произведение.
Предыдущая реализация стека только записывала новые значения в указатель стека. Однако новая реализация может записывать сумму или произведение на два индекса ниже указателя стека. Например, 12 в стеке ниже станет 15 после сложения, а это место находится на два индекса ниже указателя стека:
Перед добавлением:
[12 , 3, sp] (sp = 3)
После сложения:
[15, sp] (sp = 2)
Здесь у нас есть 12 в качестве нижней части стека и sp, указывающий на пустое пространство над стеком.
Поэтому нам нужен сигнал, указывающий на то, что определенный столбец находится на два элемента ниже указателя стека.
Приведенный в оригинальной статье код в значительной степени заимствован из стека предыдущей главы, но в нем реализованы обновления, описанные в этой главе. А именно:
- Мы заменили NOP, PUSH и POP на NOP, PUSH, ADD и MUL. ADD и MUL уменьшают указатель стека на единицу, NOP сохраняет указатель стека неизменным, а PUSH увеличивает указатель стека на единицу и копирует свой аргумент в вершину стека.
Если хотите покопаться в самом коде, то лучше перейти на оригинальную статью, где он представлен в развернутом виде - https://www.rareskills.io/post/zkvm.
Также его можно перенести в редактор кода с нейронными сетями и изучить, разбивая на небольшие сниппеты.
#zkvm