Как сопоставить ответы Chainlink VRF с розыгрышами при нарушении очередности
Две игры запросили случайность, пока ни один ответ ещё не пришёл. Если назначать первый callback самому старому розыгрышу, результаты можно перепутать даже при двух корректных доказательствах.
Сохраните связь при создании запроса
Запишите ID, который вернул VRF, вместе с идентификатором розыгрыша. В примере запрос 42 получает ответ раньше 41. Поиск по ID привязывает первое слово к синему розыгрышу, второе — к красному, независимо от порядка доставки.
const drawFor = new Map([[41n,"red"], [42n,"blue"]]);
for (const [id,word] of [[42n,900n],[41n,700n]]) {
console.log(drawFor.get(id), word.toString());
}
Зафиксируйте исходные данные розыгрыша
До запроса случайности закройте приём заявок и сохраните список и порядок участников. Правильной привязки слова к ID недостаточно, если порядок потом можно изменить. Принимайте ответ через авторизованный callback координатора и отмечайте исполнение. Задержавшийся запрос оставляйте доступным для сверки: возможность отбросить неудачный результат и запросить новый меняет условия розыгрыша.