Часть III · Глава 27 из 43 · Paris · The Merge

EIP-4399: PREVRANDAO — откуда берётся случайность в блокчейне

EVM детерминирован — у него нет опкода «случайное число», потому что каждый узел обязан вычислить одинаковый результат. Контракты, которым нужна была случайность, злоупотребляли опкодом DIFFICULTY — слабым и подверженным манипуляциям майнеров, — который исчез после The Merge. EIP-4399 переиспользует этот опкод, чтобы раскрыть RANDAO beacon-цепочки, давая контрактам настоящий (хотя и смещаемый) маяк случайности.

Обновлено 24 июн. 2026 г. · 8 мин
Предполагается
  • детерминизм EVM
  • The Merge и beacon-цепочка

Paris / The Merge, сентябрь 2022 года. Вот вопрос, который звучит тривиально, но таким не является: как смарт-контракт получает случайное число? На обычном компьютере вы бы вызвали функцию случайности. Но EVM детерминирован — каждый узел заново исполняет каждую транзакцию и обязан прийти к идентичному результату, иначе узлы разойдутся в состоянии. Настоящий опкод random() поэтому невозможен: что бы он ни возвращал, значение должно быть одинаковым на каждой машине, а это противоположность случайности. Контрактам всё равно нужна была случайность, и они хватались за ближайшее, что выглядело непредсказуемым, — а The Merge одновременно сломал этот хак и предложил кое-что получше. EIP-4399 — этот обмен. Давайте его выведем.

1 шаг Нет случайности в общей машине

Проблема: детерминизм запрещает случайность

Поскольку каждый узел обязан вычислять одинаковое состояние, EVM не может иметь настоящий источник случайности — любое произведённое им значение должно быть воспроизводимо для всех. Поэтому опкода для случайности нет, а контракты, которым нужна была непредсказуемость, импровизировали. Излюбленным хаком был опкод DIFFICULTY (0x44), возвращавший сложность proof of work блока — число, менявшееся от блока к блоку и казавшееся непредсказуемым. Но это была слабая случайность: майнеры могли её подталкивать, и она не проектировалась как неугадываемая. Хуже того, с The Merge proof of work закончился, и сложности не стало вовсе — фундамент хака просто исчез.

EVM детерминирован — каждый узел должен согласиться нет опкода случайности тот же вход → тот же выход DIFFICULTY (0x44) злоупотребляли — слабый и смещён майнерами а после Merge сложности нет вообще контрактам нужен источник случайности — но настоящий, общий для всех бикон-чейн уже производит его: RANDAO
EVM детерминирован — нет опкода случайности, потому что каждый узел обязан соглашаться. Контракты злоупотребляли опкодом DIFFICULTY как слабой, подверженной смещению майнерами заменой случайности — а конец proof of work на The Merge убрал и это. Но beacon-цепочка уже производит значение случайности: RANDAO.

→ Шаг 2: да, есть — RANDAO beacon-цепочки.

2 шаг Раскрываем RANDAO

Переиспользуем опкод, чтобы он возвращал RANDAO

Beacon-цепочка уже ведёт общее значение случайности под названием RANDAO Значение случайности, которое beacon-цепочка накапливает, подмешивая вклад от каждого предлагающего блока (раскрытие из его приватной, заранее зафиксированной последовательности). Ни один отдельный валидатор не контролирует результат, и он одинаков для каждого узла. : в каждом блоке предлагающий раскрывает значение, которое подмешивается (через XOR) в текущий RANDAO, так что ни один валидатор его не контролирует, и каждый узел хранит одно и то же число. EIP-4399 просто раскрывает его для EVM — переиспользуя ставший бессмысленным опкод DIFFICULTY (0x44), переименованный в PREVRANDAO Новое, эпохи The Merge, значение опкода 0x44 (бывшего DIFFICULTY): он возвращает предыдущее значение RANDAO beacon-цепочки — 32-байтовое число, доступное контрактам как маяк случайности. . Теперь PREVRANDAO возвращает RANDAO предыдущего блока — 32-байтовое значение с beacon-цепочки, — так что у контракта есть встроенный маяк случайности, с которым согласен каждый узел, без нового слота опкода или специального механизма.

бикон-чейн подмешивает случайность каждый блок: RANDAO v0 v1 v2 v3 RANDAO PREVRANDAO (0x44) DIFFICULTY переиспользован — возвращает предыдущий RANDAO теперь контракт читает 32-байтный beacon случайности
Beacon-цепочка подмешивает вклад от каждого предлагающего в текущий RANDAO. EIP-4399 переиспользует старый опкод DIFFICULTY (0x44) как PREVRANDAO, возвращающий предыдущий RANDAO, — так что контракт может прочитать 32-байтовое, согласованное сетью значение случайности.

→ Шаг 3: знаем в точности, насколько она слаба.

3 шаг Слабая — обращайтесь осторожно

Итог — и острая грань

PREVRANDAO — это настоящий, согласованный сетью маяк случайности, и для низкорисковых применений (выбор товара дня, разрешение ничьей, джиттер) он вполне подходит. Но это не сильная случайность, и использовать её так, будто это не так, — классическая ошибка. Причина: смещение предлагающим (proposer bias) Предлагающий блока узнаёт значение RANDAO, которое будет применяться к его слоту, на эпоху вперёд, и может решить пропустить (не предлагать) свой слот — теряя вознаграждение, но меняя, какой RANDAO применится. Так у предлагающего есть ограниченное, но реальное влияние на «случайный» результат. означает, что сторона, собирающая блок, знает значение заранее и может немного подшлифовать его, пропустив слот. Так что для чего-либо ценного — лотереи, крупного случайного распределения — контрактам стоит добавить сверху схему commit-reveal или использовать внешнюю проверяемую функцию случайности (например, Chainlink VRF). PREVRANDAO — это пол, а не потолок.

но это слабая случайность — осторожно предлагающий… знает это на эпоху вперёд пропустить слот → сместить исход ✓ подходит при низких ставках ✗ не для больших сумм используйте commit-reveal или VRF встроенный маяк случайности — достаточно, если немного смещения не критично после Merge — отсюда on-chain «случайность»
PREVRANDAO слаб: предлагающий знает значение заранее и может пропустить слот, чтобы сместить его. Годится, когда небольшое смещение допустимо; для высокоценной случайности добавьте сверху схему commit-reveal или проверяемую функцию случайности (VRF).
04 Глубже Куда двигаться дальше