Солидность - генерирует непредсказуемое случайное число, которое не зависит от ввода - PullRequest
2 голосов
/ 01 октября 2019

Я знаю, что «как генерировать случайное число» в солидности - очень распространенный вопрос. Однако после прочтения большинства ответов я не нашел подходящего для своего случая.

Краткое описание того, что я хочу сделать: у меня есть список объектов, каждый из которых имеет уникальный идентификатор, номер. Мне нужно создать список, который содержит 25% этих объектов, , выбираемых случайным образом при каждом вызове функции . На человека, вызывающего функцию, нельзя полагаться, чтобы он предоставил входные данные, которые каким-либо образом предсказуемо повлияют на итоговый список.

Единственный ответ, который я нашел, который дает безопасное случайное число, был Здесь . Тем не менее, это зависит от участия участников и предназначено для решения сценария азартных игр. Я не могу использовать это в моей реализации.

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

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

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

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

При этом существуют такие проекты, как RanDAO , которые претендуют на создание надежной псевдослучайности в цепочке блоков.

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

В качестве примера, который мне только что пришёл в голову: вы можете использовать Oraclize для периодического вызовадоверенному внешнему JSON API, который возвращает псевдослучайные числа и проверяет в контракте, что вызов действительно выполнен.

Конечно, недостатком этих методов является то, что вам и / или вашим пользователям придется тратить больше газавыполнение умных контрактов, но этоНа мой взгляд, справедливая цена за огромные преимущества в безопасности.

0 голосов
/ 22 октября 2019

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

Существует много интересных способов генерирования случайного числа с помощью Smart Contract - с использованием DAO, Oracle и т. Д. - но все они имеют некоторые компромиссы.

Итак, в заключение, нет никакого метода, который вы ищете. Вам нужно что-то пожертвовать.

: (

...