Проверка снапшотов

Проблема

Когда валидатор загружается из моментального снимка, ему нужен способ быстро проверить соответствие набора учетных записей тому, что видит остальная часть сети. потенциал Злоумышленник может дать валидатору неверное состояние, а затем попытаться убедить его принять транзакцию, которая в противном случае была бы отклонена.

Решение

В настоящее время хэш банка получается путем хеширования дельта-состояния счетов в слоте, который затем объединяется с предыдущим значением хэша банка. Проблема в том, что список хэшей будет расти на порядок количества слотов, обрабатываемых цепочкой, и станет бременем для обоих. передать и проверить успешно.

Другим наивным методом может быть создание дерева меркла состояния учетной записи. Недостатком этого является то, что при каждом обновлении учетной записи дерево меркле должен быть пересчитан из всего состояния учетных записей всех реальных учетных записей в системе.

Для проверки снимка делаем следующее:

В хранилище аккаунтов ненулевых лэмпорт-аккаунтов мы хешируем следующие данные:

Используйте полученное хеш-значение в качестве входных данных для функции расширения, которая преобразует хэш-значение в значение изображения. Функция создаст блок данных размером 440 байт, где первые 32 байта — это хеш-значение, а следующие 440–32 байта — генерируется из Chacha RNG с хешем в качестве семени.

Затем изображения учетных записей объединяются с помощью xor. Предыдущее значение учетной записи будет преобразовано в состояние, и новое значение учетной записи также будет преобразовано в состояние.

Хэш-значения голосования и системной переменной происходят вместе с хэшем результирующего полного значения изображения.

При загрузке валидатора, когда он загружается из моментального снимка, он проверяет хэш-значение с установленными учетными записями. Тогда бы используйте SPV, чтобы отобразить процент сети, проголосовавшей за указанное значение хеш-функции.

Полученное значение может быть проверено валидатором как результат объединения всех текущих состояний учетной записи вместе.

Снапшот должен быть очищен от учетных записей с нулевыми лампами перед созданием и во время проверки, поскольку учетные записи с нулевыми лампами не влияют на значение хеш-функции, но могут вызвать банк-валидатор, чтобы прочитать, что учетная запись отсутствует, когда она действительно должна быть.

Атака на состояние xor может повлиять на его значение:

Таким образом, размер изображения 440 байт взят из этой статьи, что позволяет избежать конфликта xor с 0 (или, следовательно, с любым другим заданным битовым шаблоном): [https://link.springer.com/content/pdf/10.1007%2F3-540 -45708-9_19.pdf]

В этом случае математика обеспечивает 128-битную безопасность:

O(k * 2^(n/(1+lg(k)))
k=2^40 accounts
n=440
2^(40) * 2^(448 * 8 / 41) ~= O(2^(128))