Block-Sena Технический документ
Безопасность и прозрачность

Поддается сторона, розыгрыш on-chain может быть проверена кем угодно

В Block-Sena розыгрыш используется двухфазная схема. commit-reveal поток в сочетании с а будущий блокхеш и prevrandao. Это делает результат детерминированным после выполнения, проверяемый в блокчейне и устойчивый к ручным манипуляциям с выпавшими числами.

6 из 30 Базовая игра с 6 уникальными вариантами выбора и розыгрышем 6 уникальных номеров.
6 а 10 Билет с множественным выбором и комбинаторными квотами на выигрыш (4/5/6 совпадений)
Мультитокен Выплата за токен с независимым расчетом и проверяемой carry-over

Обзор

Block-Sena — это лотерея on-chain, в которой покупка билетов, блокировка раунда, розыгрыш и розыгрыш призов Распределение фиксируется в помещении. В протоколе используется двухфазный поток: blockSenaPauseDraw (блокирует раунд и записывает обязательство) и blockSenaDrawPay (раскрывает, рисует и платит).

Цель

Гарантируйте проверяемый, воспроизводимый процесс с прозрачными правилами выплат для каждого раунда.

Проверяемость

Любой может проверить входные данные (фиксацию, соль, целевой блок), расчет начального числа, выпавшие числа и события расчета.

Фиксация-обнародование (2 этапа)

Фаза 1: Пауза + Фиксация

Функция blockSenaPauseDraw(usdValuePoolSnapshot, commitHash) запирает раунд для новых покупок устанавливает будущий целевой блок и сохраняет только секретную соль хэш.

Фаза 2: Открытие + Вытягивание + Оплата

Функция blockSenaDrawPay(соль) подтверждает это keccak256(соль) == commitHash, использует целевой блок блокхеш, генерирует 6 уникальных номеров и осуществляет выплаты.

Техническое окно блокчейна

блокхеш можно прочитать только ~256 блоков. Если срок его действия истекает, требуется раунд. оперативный сброс. Этот сброс является редким отказоустойчивым с тайм-аутом on-chain, и при каждом использовании on-chain остается открытым.

Соляные обязательства

commitHash = keccak256(abi.encodePacked(salt))
Соль не раскрывается на этапе 1. Публичным является только хэш. На этапе 2 обнаруженная соль должна точно соответствовать коммиту.

Целевой блок

целевойБлок = номер блока + 5
При розыгрыше используется хэш будущего блока. Во время фиксации этот хэш блока еще не существует, поэтому никто не знает эти входные данные заранее.

Поток рисования (21:00 UTC -> +5 блоков -> DrawPay)

Операционный поток Block-Sena четко разделен закрытие билета от генерация 6 чисел. Такое разделение исключает риск покупки билетов. после того, как станет известен результат, или пытаются подогнать билеты в соответствии с выпавшими числами.

1) 21:00 UTC (рабочее окно) -> blockSenaPauseDraw

Функция blockSenaPauseDraw(usdValuePoolSnapshot, commitHash) запирает раунд, блокирует новые покупки, записывает commitHash, определяет целевойБлок = номер блока + 5и сохраняет снимок пула в долларах США.

2) Билеты заморожены до появления случайности

После PauseDraw, ни один новый билет не может войти в этот раунд. В тот момент, blockhash(targetBlock) до сих пор не существует, поэтому последние 6 чисел пока невозможно предсказать или вычислить.

3) +5 блоков (после целевого блока) -> blockSenaDrawPay

Функция blockSenaDrawPay(соль) проверяет соль на соответствие коммиту, читает целевой блок блокхеш, последовательно 6 уникальных чисел и выполнение Выплаты за токен. Если возникает перед целевым блоком, транзакция получает on-chain.

4) Публичная проверка в любое время

Любой желающий может проверить в проводнике: blockSenaPauseDraw Техас, целевойблок, blockSenaDrawPay Техас, раскрытая соль, выпавшие номера и события расчета/выплаты.

Чему препятствует такая конструкция на практике

Это невозможно купить билет после просмотра 6 чисел раунда, потому что раунд уже заблокирован blockSenaPauseDraw до того, как был проведен розыгрыш.

Это невозможно знать 6 чисел во время блокировки, потому что формула зависит в будущем блоке (целевойблок), которого на данный момент еще не существует.

Это невозможно провести розыгрыш до технического времени, поскольку blockSenaDrawPay требуется on-chain, чтобы текущий блок уже прошел целевойблок.

О ResetDraw (редкий сценарий)

blockSenaResetDraw существует только для того, чтобы предотвратить постоянное застревание раунда если постоянно поддерживать сбой отсутствия (например: сбои RPC, сервисное обслуживание, в сетях/инфраструктуре или долгосрочных проблемах) и DrawPay не может быть выполнено раньше blockhash(targetBlock) истекает.

В обычном потоке ожидаемое поведение заключается в выполнении DrawPay через несколько кварталов после PauseDraw (цель на +5 блоки). Сброс — это гарантия жизнеспособности, не является частью обычного процесса рисования.

Математическая формула розыгрыша (6 уникальных чисел)

Начальное значение отрисовки получается из комбинации будущего блока, зафиксированной соли и круглых данных. Из него контракт генерирует числа от 1 до 30, отбрасывая дубликаты, пока не достигнет 6 уникальных чисел.

С точки зрения оперативной безопасности: поскольку билеты уже заморожены в PauseDraw на этапе до того, как этот будущий блок существует, розыгрыш не может быть «создан» соответствовать билету, вставленному позже, и ни один участник не может делать ставки в том же раунде после зная результат.

Нарисовать семя

семья = keccak256(abi.encodePacked(blockhash(targetBlock), соль, блок.prevrandao, roundId))
Реальные входные данные, используемые в контракте: blockhash(targetBlock), соль, блок.prevrandao, и currentRoundId.

Генерация каждого номера

num = (keccak256(seed, nonce) mod 30) + 1
Если число уже было выпало в этом раунде, оно отбрасывается и одноразовый номер увеличивается. Процесс повторяется до тех пор, пока не будут получены 6 уникальных чисел.

Эта процедура предотвращает повторение чисел в конечном результате и сохраняет розыгрыш в допустимом диапазоне. 1..30.

Важно (прозрачность) Результат итогового раунда определяется и воспроизводится с помощью данных on-chain. Любой оперативный параметр попытки (например, сброс раунда) оставляет общедоступный и проверяемый след on-chain.

Билет с множественным выбором (от 6 до 10 номеров) и комбинаторные квоты

В Block-Sena билет можно оставить от 6 до 10 цифр. Этот билет представляет собой несколько эквивалентные комбинации из 6 цифр. Расчет приза основан на выигрыш квот (комбинации), а не просто «люди».

Всего комбинаций для билета с k номерами

комбо(к) = С(к, 6)
Пример: если к = 10, затем С(10,6) = 210 эквивалентные комбинации.

Выигрышные квоты по уровням (4/5/6)

Рассмотрим билет с к цифры и х совпадения внутри 6 выпавших номеров.

q6 = С(х, 6)
q5 = C(x, 5) * C(k - x, 1)
q4 = C(x, 4) * C(k - x, 2)
Контракт суммирует эти квоты на каждый кошелек и выплачивает их в агрегированной форме за каждый токен (более эффективно).

Пример (10-значный билет с 6 выпавшими числами внутри 10)

q6 = 1, q5 = 24, q4 = 90. Один и тот же билет может выиграть одновременно во всех трех уровнях.

Выплата по нескольким токенам (расчет за токен)

Каждый пул токенов (например, участок, USDC, USDT) рассчитывается независимо. В контракте изобретательные победители и призы по раундам. и, кстати, сохранение точной истории в RoundTokenStats.

Разделение уровней

Уровень с 6 попаданиями = 80% пула токенов
Уровень с 5 попаданиями = 15% от пула токенов
Уровень с 4 попаданиями = 5% от пула токенов

Приз за выигравшую квоту

PrizePerWinnerX = пол (prizeBucketX / quotasX)
В делении используется целочисленная арифметика on-chain. Остатки округления (пыль) остаются как carry-over для следующего раунда.

Если нет победителей

Сумма этого уровня не зависит: в следующем раунде для этого токена она станет carry-over.

Если победителей несколько

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

Как провести аудит раунда (шаг за шагом)

  1. Найдите blockSenaPauseDraw спасибо и обратите внимание commitHash и целевойблок.
  2. После целевого блока найдите blockSenaDrawPay Передайте и прочитайте отправленное соль.
  3. Пересчитать keccak256 (соль) и подтвердите, что он соответствует commitHash.
  4. Читать blockhash(targetBlock) в проводнике и prevrandao из блока Draw TX.
  5. Воспроизведите начальное число и процедуру генерации 6 чисел (отбрасывая дубликаты) и сравните с НичьяВыполнено.
  6. Если произошел редкий эксплуатационный сбой, проверьте DrawReset (roundId, targetBlock, блок сброса) для проверки тайм-аута и сброса трассируемости.
  7. Проверять RoundTokenSettled события для пулов, выплаты по уровням и токены carry-over.
  8. Подтвердите переводы в формате ERC20, чтобы обеспечить справедливые выплаты победителям.

Гарантии, прозрачность и операционные ограничения

Block-Sena был разработан таким образом, чтобы результаты округлений были проверяемые, воспроизводимые и прозрачные. Фиксация-раскрытие в Контракте с будущим блоком значительно снижает возможность ручного манипулирования результатом.

В техническом плане модель дает результат непредсказуемый во время блокировки, потому что раунд закрывается до blockhash(targetBlock) используемый в семени существует. Это позволяет сделать формулу общедоступной и доступной для проверки, не позволяя делать последующие ставки на основе результата.

Что держится on-chain

Правила розыгрыша, расчет квот, разделение выплат по уровням (80/15/5), история каждого токена, события и отслеживание каждого шага.

Аварийная операция

Существует функция сброса отрисовки для различных технических условий (например, истечение срока действия хэша, вызванное долго сбой работы/сети). Его можно восстановить только при заблокированном раунде и после таймаута on-chain. Каждое использование является общедоступным, записывается on-chain и может быть проверено в проводнике.

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

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

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

другие слова: Block-Sena не требует слепого доверия. Он обеспечивает поток, который можно наблюдать, математически воспроизведено и проверено on-chain кем угодно и когда угодно.