Сначала игроки депозитят деньги на контракт, по очереди, каждый закидывает по 21$ как в вашем примере.
Для честного рандома нужно сделать чтобы каждый игрок генерировал случайную строку, и потом эти 2 строки отправлялись бы в хэш функцию(код которой есть у всех сторон) из которой уже выдаются числа, так что каждый участвует в создании рандома.
Транзакцию на получение приза отправляет победитель, так как он в этом заинтересован. Но чтобы забрать приз с контракта - нужно чтобы третья сторона(ваш сервер/казино) дали свой апрув в виде подписи.
Нужно либо на контракте реализовывать логику получения победителя из 2х рандомных строк(что может быть дорого по газу, хотя для кубиков норм) либо вам нужен некий оператор/админ контракта, приватный ключ которого лежит на вашем сервере и его подпись необходима чтобы забрать деньги с контракта.
Сервер получает все те же 2 рандомные строки от игроков, загоняет их в хеш функцию для получения рандома, и отправляет победителю подписанную дату, которую победитель передает в вызове метода контракта.
Контракт проверяет подписи и распределяет деньги игроков.
В общем мало чем отличается от обычного multisig. В Solana попроще с offchain транзакицями и несколькими сигнерами для одной транзы, если не критичен блокчейн binance/ethterum присмотритесь к ней. +маленькие коммисии за отправку транз.
Пример получения любого количества чисел из одной строки на js и solidity -
https://replit.com/@AlexStep2/RNG - в принципе можно прям на контракте проверять кто выиграл