Представляем перевод статьи Sung-Jae Woo - Making Virtual Machine Integrity Checks Efficient
Виртуальная машина Aergo - AVM постоянно совершенствуется нашими разработчиками виртуальных машин. Время от времени группа проверяет, не вызывает ли какая-либо из новых модификаций, внесенных в AVM, какие-либо ошибки в системе. До недавнего времени единственным способом сделать это была полная синхронизация с сетью.
Поскольку сеть Aergo работает уже более двух месяцев, наш блокчейн уже превысил 4,5 миллиона блоков. Теперь для полной синхронизации нового узла из блока 0 (genesis block) требуется в среднем 5 часов. Это означает, что простая проверка целостности виртуальной машины занимает более 5 часов! Это все равно что использовать кувалду, чтобы сломать орех. Пять часов - это слишком долго.
После обсуждений и тестирований наша команда выяснила, каким образом мы можем оптимизировать процесс оценки целостности виртуальной машины с помощью простой настройки кода. Эта статья описывает проделанную нами работу.
Синхронизация блоков
Во-первых, давайте рассмотрим, что происходит во время синхронизации блоков и что замедляет этот процесс. Грубо говоря, синхронизация блоков происходит следующим образом:
- Блок передается из сети в Chain Service¹ (CS) через P2P Service².
- CS проверяет его вместе с входящими в его состав транзакциями, а затем, если все верно, сохраняет его на устройство хранения данных (диск).
- Транзакции выполнены.
- Результаты сверяются с соответствующими полями заголовка блока.
- Все результаты передаются на устройство хранения.
Префиксное дерево (Trie) записывает все изменения, внесенные при выполнении каждого блока. Как только узел включен в Trie, он никогда не удаляется. Каждая модификация в Префиксном дереве неизбежно влияет на содержимое корневого узла, который, в свою очередь, изменяет состояние корневого хэша. Кроме того, состояние выполнения каждой транзакции в блоке также сохраняется как квитанция. Из квитанций каждого блока строится дерево Merkle, и его соответствующий хэш (корневой хэш Merkle) затем помещается в заголовок блока.
Таким образом, результаты шага 4 (который описан выше) таковы:
- State Root Hash (SRH)
- Receipts Merkle Root Hash (RMRH)
Оба этих хэша включаются в заголовок блока при создании блока.
Каждая виртуальная машина должна выдавать тот же SRH и RMRH, что и результаты выполнения для блока. Если две виртуальные машины генерируют разные SRH (или RMRH), это означает, что одна из виртуальных машин не следовала протоколу. Таким образом, только 3-й и 4-й пункты обязательны для проверки целостности AVM. Однако на самом деле большую часть времени занимают другие фазы.
Почему? Потому что они включают медленные задачи, такие как ввод/вывод диска, запросы и ответы по сети, IPC между различными модулями и т.д. Например, для синхронизации одного блока запускается по крайней мере 1 диск считывания (с удаленного узла) и 2 диска записи (на текущий узел), даже если рассматривается только сам блок ввода/вывода.³ Среди них операции ввода/вывода диска совершенно не нужны для проверки целостности виртуальной машины Aergo.
Так что же нам делать, чтобы получить быструю проверку целостности виртуальной машины? Мы должны сделать то, что нам действительно нужно: выполнение (3-я фаза) и верификация (4-я фаза).
Эффективная проверка целостности виртуальной машины AVM
Чтобы проверить целостность виртуальной машины, нам нужен блокчейн, который полностью синхронизирован с основной сетью. Следовательно, операции ввода-вывода неизбежны. Но это не значит, что мы должны делать это во время проверки целостности виртуальной машины. Проверки целостности виртуальных машин проводятся время от времени, и только в случае необходимости.
Если мы запускаем полный узел в обычное время, мы можем пропустить эти длинные, перетаскивающие операции. Для этого не нужно ничего кодировать. Нам остается выполнить следующие действия:
- Считайте каждый блок из блока 1.
- Выполняйте действие.
- Проверьте полученные SRH и RMRH по сравнению с теми, которые находятся в заголовке блока без записи на диск.
- Повторите описанные выше действия с 1 по 3 до конца.
Эта последняя часть является фактической проверкой целостности AVM. Это может быть выполнено для полностью синхронизированных данных блокчейна, полученных в процессе разработки новой функции. Таким образом, мы можем полностью исключить медленные процессы, включая сетевые соединения и операции записи на диск, из процесса проверки целостности виртуальной машины Aergo.
Резюме
Итак, как происходит проверка? Сама синхронизация завершается менее чем за 6 часов. После этого действия, проверка целостности виртуальной машины Aergo, для предварительно синхронизированных данных блокчейна, занимает всего около 8 минут. Это всего 2,7% от полного времени синхронизации. Теперь мы можем работать намного эффективней :-) Более того, поскольку эта функция позволяет быстро воспроизводить и проверять цепочку блоков, ее можно использовать даже для обнаружения подделок данных.
¹ Это программный уровень, отвечающий за управление блокчейном.
² Это программный уровень, отвечающий за связь P2P с другими узлами.
³ Фактических операций ввода-вывода больше, поскольку ввод-вывод для каждого блока сопровождаются операциями ввода/вывода для некоторых связанных с ними метаданных.
Больше информации о проекте Aergo вы можете узнать на сайте проекта или на страницах нашего сайта.