EIP-4399: PREVRANDAO — откуда берётся случайность в блокчейне
EVM детерминирован — у него нет опкода «случайное число», потому что каждый узел обязан вычислить одинаковый результат. Контракты, которым нужна была случайность, злоупотребляли опкодом DIFFICULTY — слабым и подверженным манипуляциям майнеров, — который исчез после The Merge. EIP-4399 переиспользует этот опкод, чтобы раскрыть RANDAO beacon-цепочки, давая контрактам настоящий (хотя и смещаемый) маяк случайности.
- детерминизм EVM
- The Merge и beacon-цепочка
Paris / The Merge, сентябрь 2022 года. Вот вопрос, который звучит тривиально, но таким не является: как смарт-контракт получает случайное число? На обычном компьютере вы бы вызвали функцию случайности. Но EVM детерминирован — каждый узел заново исполняет каждую транзакцию и обязан прийти к идентичному результату, иначе узлы разойдутся в состоянии. Настоящий опкод random() поэтому невозможен: что бы он ни возвращал, значение должно быть одинаковым на каждой машине, а это противоположность случайности. Контрактам всё равно нужна была случайность, и они хватались за ближайшее, что выглядело непредсказуемым, — а The Merge одновременно сломал этот хак и предложил кое-что получше. EIP-4399 — этот обмен. Давайте его выведем.
Проблема: детерминизм запрещает случайность
Поскольку каждый узел обязан вычислять одинаковое состояние, EVM не может иметь настоящий источник случайности — любое произведённое им значение должно быть воспроизводимо для всех. Поэтому опкода для случайности нет, а контракты, которым нужна была непредсказуемость, импровизировали. Излюбленным хаком был опкод DIFFICULTY (0x44), возвращавший сложность proof of work блока — число, менявшееся от блока к блоку и казавшееся непредсказуемым. Но это была слабая случайность: майнеры могли её подталкивать, и она не проектировалась как неугадываемая. Хуже того, с The Merge proof of work закончился, и сложности не стало вовсе — фундамент хака просто исчез.
→ Шаг 2: да, есть — RANDAO beacon-цепочки.
Переиспользуем опкод, чтобы он возвращал RANDAO
Beacon-цепочка уже ведёт общее значение случайности под названием RANDAO Значение случайности, которое beacon-цепочка накапливает, подмешивая вклад от каждого предлагающего блока (раскрытие из его приватной, заранее зафиксированной последовательности). Ни один отдельный валидатор не контролирует результат, и он одинаков для каждого узла. : в каждом блоке предлагающий раскрывает значение, которое подмешивается (через XOR) в текущий RANDAO, так что ни один валидатор его не контролирует, и каждый узел хранит одно и то же число. EIP-4399 просто раскрывает его для EVM — переиспользуя ставший бессмысленным опкод DIFFICULTY (0x44), переименованный в PREVRANDAO Новое, эпохи The Merge, значение опкода 0x44 (бывшего DIFFICULTY): он возвращает предыдущее значение RANDAO beacon-цепочки — 32-байтовое число, доступное контрактам как маяк случайности. . Теперь PREVRANDAO возвращает RANDAO предыдущего блока — 32-байтовое значение с beacon-цепочки, — так что у контракта есть встроенный маяк случайности, с которым согласен каждый узел, без нового слота опкода или специального механизма.
→ Шаг 3: знаем в точности, насколько она слаба.
Итог — и острая грань
PREVRANDAO — это настоящий, согласованный сетью маяк случайности, и для низкорисковых применений (выбор товара дня, разрешение ничьей, джиттер) он вполне подходит. Но это не сильная случайность, и использовать её так, будто это не так, — классическая ошибка. Причина: смещение предлагающим (proposer bias) Предлагающий блока узнаёт значение RANDAO, которое будет применяться к его слоту, на эпоху вперёд, и может решить пропустить (не предлагать) свой слот — теряя вознаграждение, но меняя, какой RANDAO применится. Так у предлагающего есть ограниченное, но реальное влияние на «случайный» результат. означает, что сторона, собирающая блок, знает значение заранее и может немного подшлифовать его, пропустив слот. Так что для чего-либо ценного — лотереи, крупного случайного распределения — контрактам стоит добавить сверху схему commit-reveal или использовать внешнюю проверяемую функцию случайности (например, Chainlink VRF). PREVRANDAO — это пол, а не потолок.