Генерация случайного числа в Solidity без Chainlink

Здравствуйте, я хорошо знаю, что существует множество тем, посвященных обсуждению различных методов. Просто любопытно и хотел спросить прямо здесь, потому что чувствую, что ситуация может быть другой. По сути, я пытаюсь сделать так, чтобы всякий раз, когда кто-то вызывает средства из контракта, сумма, которую они получают, варьируется от 0 до 100, но, очевидно, мой текущий метод несовершенен в зависимости от текущего момента.

Я читал о ChainLink VRF, но похоже, что сборы могут быть немного раздражающими. Просто любопытно, есть ли какие-либо другие методы, о которых кто-либо знает, в противном случае мой другой вариант состоял в том, чтобы заблокировать баланс, если он приближается к текущему вознаграждению за блок, и пользователям просто придется чаще обналичивать деньги. Сомнительно, что многие пользователи получат баланс выше вознаграждения за блок, но я хотел бы изучить свои варианты.

Просто чтобы уточнить, когда я говорю заблокировать баланс, я имею в виду каждого пользователя, а не всего контракта.
Вам не нужно полагаться только на now«семя» для случайности. Вы также можете положиться на msg.sender. Другими словами, вы можете использовать что-то вроде abi.encodePacked(now, msg.sender).
Я уже пробовал, что, к сожалению, злонамеренный пользователь может создать другой контракт, чтобы получить тот же номер результата со своим адресом, я полагаю? Я думал, что они могут продолжать делать этот расчет, пока не получат нужный номер, и ждать звонка в течение этого времени.

Ответы (2)

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

Наивный подход к получению случайного числа в приложении, где вы согласны с тем, что его можно «взломать»:

function random() private view returns(uint){
    return uint(keccak256(abi.encodePacked(block.difficulty, now, number)));
}

В противном случае вы захотите использовать Chainlink VRF . Вот статья на эту тему , если вы хотите узнать больше.

Думаю об использовании сетевого оракула Rhombus, но пытаюсь получить больше информации, спасибо!

Если комиссионные сборы Chainlink слишком велики, вы всегда можете создать свой собственный случайный маяк, который отправляет случайные числа в блокчейн. Затем запустите это на узле DigitalOcean за 5 долларов и немного ETH на горячем кошельке, чтобы публиковать числа достаточно часто для вашего варианта использования.

Как это число будет введено в блокчейн/контракт? Кажется, что это лучший вариант, но некоторые пользователи не предпочтут его. Спасибо!
Самый простой способ заключается в том, что на сервере есть задание таймера, которое записывает новое случайное число в ваш смарт-контракт каждый день/неделю/месяц. Также вы не знаете, заботятся ли пользователи, пока не спросите :)
Верно :) спасибо за помощь! При создании dapps просто придерживайтесь полной децентрализации, если это возможно, так что, возможно, это будет более личное.