Как мы можем генерировать несколько случайных чисел в эфириуме? - PullRequest
0 голосов
/ 23 сентября 2018

Я хочу, чтобы мой смарт-контракт возвращал 7 или 8 УНИКАЛЬНЫЕ случайные числа в диапазоне от 1 до 100 при вызове контракта.Какой может быть лучший подход для получения такого результата?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вероятно, если вы пытаетесь создавать рулетки, лотереи и карточные игры с использованием блокчейна Ethereum, поскольку блокчейн Ethereum является детерминированным, это создает определенные трудности для тех, кто решил написать собственный генератор псевдослучайных чисел (PRNG)..

Некоторые уязвимые методы, используемые в настоящее время

Если вы используете переменные блока, такие как block.coinbase, block.difficulty, block.timestamp и т. Д. В качестве источникаЭнтропия, все эти блочные переменные могут управляться майнерами, поэтому они не могут быть использованы в качестве источника энтропии из-за стимулов майнеров.Поскольку переменные блока, очевидно, совместно используются в одном и том же блоке, вы можете легко использовать внутренние сообщения для получения одинакового результата.

Другие методы похожи на использование блочного хэша текущего или некоторого прошлого блока или блочного хэша прошлого блока в сочетании с частным начальным числом.В этих случаях используется функция block.blockhash (block.number).Однако в момент выполнения транзакции в EVM хеш-блок создаваемого блока еще не известен по очевидным причинам, и EVM всегда будет давать ноль.Если мы пытаемся сделать это с помощью хэша предыдущего блока, злоумышленник может заключить контракт на использование с тем же кодом, чтобы вызвать целевой контракт с помощью внутреннего сообщения.«Случайные» числа для двух контрактов будут одинаковыми.

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

Некоторые области, которые стоит изучить

  • Внешнийoracles
  • Signidice
  • Зафиксировать-раскрыть подход

С такими внешними оракулами, как Oraclize, умные контракты могут запрашивать данные из веб-API, такие как курсы валют, прогнозы погоды,и цены на акции (например, random.org).Основной недостаток этого подхода в том, что он централизован.Будет ли Oraclize вмешиваться в результаты демона?Можем ли мы доверять random.org?

Вместо Oraclize мы также можем использовать BTCRelay, который является мостом между блок-цепями Ethereum и Bitcoin.Используя BTCRelay, умные контракты в блокчейне Ethereum могут запрашивать будущие биткойны и использовать их в качестве источника энтропии.

Signidice - это алгоритм, основанный на криптографических сигнатурах, который можно использовать для случайного числаГенерация умных контрактов с участием только двух сторон: игрока и дома.Алгоритм работает следующим образом:

  • Игрок делает ставку, вызывая умный контракт.
  • Дом видит ставку, подписывает ее своим закрытым ключом и отправляет подписьСмарт-контракт.
  • Интеллектуальный контракт проверяет подпись с использованием известного открытого ключа.
  • Эта подпись затем используется для генерации случайного числа.

Commit–Подход раскрытия состоит из двух этапов:

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

Лучшая реализация подхода фиксации и раскрытия - Randao ,Коммит-раскрытие может быть объединен с будущими блочными хэшами, чтобы сделать его более безопасным.

Это в значительной степени охватывает все методы генерации случайных чисел с использованием Ethereum.

0 голосов
/ 23 сентября 2018

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

С учетом сказанного, одним из лучших решений является использование оракула, который получает случайное число от внешнего (Читайте: источник не на блокчейне).Взгляните на это руководство.Ethtroll Dapp является хорошим примером этого, поэтому взгляните на код здесь .Они используют Oraclize для получения случайного числа из Random.org.

Проблема с использованием оракула - фактор централизации.Если вы настроили свой Dapp так, как я описал выше, вы попадаете в зависимость от сотрудника Rouge в двух разных централизованных сервисах - Oraclize и Random.org.Хотя вряд ли кто-то будет манипулировать каким-либо из этих источников, люди будут совершать иррациональные действия для получения потенциальной экономической выгоды.

...