区块链 – 我们如何在以太坊中生成多个随机数?

我希望我的智能合约在签订合同时返回7或8个独特的随机数,范围从1到100.什么是获得这种结果的最佳方法?

解决方法

可能如果你正在尝试使用以太坊区块链来构建轮盘赌,彩票和纸牌游戏,因为以太坊区块链是确定性的,它给那些选择编写自己的伪随机数生成器(PRNG)的人带来了一定的困难.

目前使用的一些易受攻击的方法

如果你使用块变量如block.coinbase,block.difficulty,block.timestamp等作为熵源,所有这些块变量都可以由矿工操纵,因此它们不能用作熵源,因为它矿工的激励.由于块变量显然在同一个块中共享,因此您可以轻松地使用内部消息来产生相同的结果.

其他方法类似于使用当前块或一些过去块的块
过去街区的块或块与私人种子相结合. block.blockhash(block.number)函数用于这些情况.但是,在EVM中执行事务的那一刻,由于显而易见的原因,尚未知道正在创建的块的blockhash,并且EVM将始终为零.如果我们使用前一个块的blockhash进行尝试,攻击者可以使用相同的代码制作漏洞利用合同,以便通过内部消息调用目标合同.两份合约的“随机”数字将是相同的.

即使我们将blockhash与私有种子结合起来,本质上是透明的,区块链也不能用于以明文形式存储秘密.从合同存储中提取私有变量指针的值并将其作为参数提供是微不足道的.利用.

一些值得探索的领域

>外部神谕
> Signidice
>提交揭示方法

使用像Oraclize这样的外部专家,智能合约可以从Web API请求数据,如货币汇率,天气预报和股票价格(如random.org).这种方法的主要缺点是它是集中的. Oraclize守护进程会篡改结果吗?我们可以信任random.org吗?

我们也可以使用BTCRelay而不是Oraclize,它是以太坊和比特币区块链之间的桥梁.使用BTCRelay,以太坊区块链中的智能合约可以请求未来的比特币阻塞并将其用作熵源.

Signidice是一种基于加密签名的算法,可用于仅涉及两方的智能合约中的随机数生成:玩家和房屋.算法的工作原理如下:

>玩家通过拨打智能合约进行下注.
>房子看到赌注,用私钥签名,并将签名发送给智能合约.
>智能合约使用已知的公钥验证签名.
>然后使用此签名生成随机数.

提交揭示方法包括两个阶段:

>“提交”阶段,当事方将其加密保护的秘密提交给智能合约时.
>“揭示”阶段,当双方宣布明文种子时,智能合约验证它们是正确的,并且种子用于生成随机数.

提交揭示方法的更好实现是Randao.提交显示可以与未来的阻塞相结合,以使其更安全.

这几乎涵盖了使用以太坊生成随机数的所有方法.

相关文章

文章浏览阅读903次。文章主要介绍了收益聚合器Beefy协议在币...
文章浏览阅读952次。比特币的主要思路是,构建一个无中心、去...
文章浏览阅读2.5k次。虚拟人从最初的不温不火,到现在步入“...
文章浏览阅读1.3k次,点赞25次,收藏13次。通过调查和分析用...
文章浏览阅读1.7k次。这个智能合约安全系列提供了一个广泛的...
文章浏览阅读1.3k次。本文描述了比特币核心的编译与交互方法...