Как Chainlink VRF выбирает победителя лотереи
Обновлено · 1 мин чтения
Chainlink VRF предоставляет случайные числа вместе с доказательством. Контракт координатора проверяет доказательство, прежде чем передать результат контракту лотереи. Это позволяет проверить источник результата и повторить выбор победителя.
Почему недостаточно времени блока
Действия смарт-контракта должны воспроизводиться одинаково на всех узлах. Время и хеш блока не дают контракту независимого секретного источника случайности; некоторые участники сети могут влиять на их выбор. VRF использует внешнее вычисление, которое контракт может проверить.
Свойства VRF
- Непредсказуемость: без секретного ключа оракула нельзя заранее вычислить результат для заданного входа.
- Единственность: для заданных входа и ключа существует один корректный результат.
- Проверяемость: доказательство проверяется с помощью открытого ключа.
Последовательность розыгрыша
- Контракт закрывает раунд и фиксирует список билетов при запросе случайности.
- Событие
DrawRequestedзаписывает идентификатор запроса. - Оракул отправляет результат с доказательством координатору VRF.
- Координатор проверяет доказательство и вызывает контракт лотереи; событие
RandomWordsFulfilledсодержит исходное значение. - Контракт вычисляет выигрышные билеты, начисляет выплаты и открывает следующий раунд.
Время ожидания зависит от сети, работы оракула и настроек запроса. Таймер на карточке показывает окончание приёма ставок, а не гарантированную секунду начисления выигрыша.
От числа к билету
Слова выводятся по формуле word[i] = keccak256(abi.encode(seed, i)). Speed Round и Jackpot берут word[0] mod tickets. В Stack место i выбирает позицию i + word[i] mod (tickets − i); перемешивание исключает повторный выбор того же билета.
Что можно проверить самостоятельно
В транзакции завершения найдите ответ координатора с идентификатором, совпадающим с запросом раунда. Вычислите слова, номера билетов и их владельцев. Сравните с PrizeAwarded. Проверка тиража выполняет эти действия в браузере. Начисление выигрыша и его последующий вывод — разные операции.
Ограничения
VRF не гарантирует, что оракул ответит вовремя, и не устраняет ошибки кода лотереи. Через 24 часа без ответа можно отменить зависший розыгрыш и запросить возврат. Действия требуют транзакций и ETH. Проверьте права владельца и статус аудита перед участием.
Часто задаваемые вопросы (FAQ)
Как именно Chainlink VRF определяет победителя тиража?
После закрытия приема ставок смарт-контракт запрашивает случайное число у координатора Chainlink VRF v2.5. Оракул возвращает число с криптографическим доказательством, а выигрышный билет вычисляется как остаток от деления случайного числа на общее количество билетов.
Что произойдет, если оракул Chainlink VRF не ответит?
Если ответ от Chainlink VRF не поступит в течение 24 часов, смарт-контракт DecentraLotto позволяет любому участнику отменить розыгрыш и разблокировать 100% возврат ставок в USDT.