热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我们如何在以太坊中生成多个随机数?》经验,为你挑选了1个好方法。

我希望我的智能合约在调用合约时返回7或8个唯一的随机数,范围从1到100。获得这种结果的最佳方法是什么?



1> Joseph T F..:

也许如果您试图使用以太坊区块链来构建轮盘,彩票和纸牌游戏,由于以太坊区块链是确定性的,这给那些选择编写自己的伪随机数生成器(PRNG)的人带来了一定的困难。

当前使用的一些脆弱方法

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

其他方法类似于将当前块或某些过去的块的哈希或将过去的块的哈希与私有种子结合使用。在这些情况下使用block.blockhash(block.number)函数。但是,在EVM中执行事务时,由于明显的原因,尚不知道正在创建的块的块哈希,并且EVM总是产生零。如果我们尝试使用前一个区块的区块哈希来进行攻击,则攻击者可以使用相同的代码制定漏洞利用合同,以便通过内部消息调用目标合同。这两个合同的“随机”数字将相同。

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

一些值得探索的领域

外部神谕

Signidice

提交-披露方法

借助Oraclize之类的外部Oracle,智能合约可以从Web API请求数据,例如货币汇率,天气预报和股票价格(例如random.org)。这种方法的主要缺点是它是集中式的。Oraclize守护程序会篡改结果吗?我们可以信任random.org吗?

除了Oraclize,我们还可以使用BTCRelay,它是以太坊和比特币区块链之间的桥梁。使用BTCRelay,以太坊区块链中的智能合约可以请求未来的比特币区块哈希并将其用作熵的来源。

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

玩家通过调用智能合约下注。

房屋看到下注,用其私钥对其进行签名,然后将签名发送到智能合约。

智能合约使用已知的公钥验证签名。

该签名然后用于生成随机数。

提交-披露方法包括两个阶段:

“提交”阶段,当事双方将其受密码保护的机密提交给智能合约。

在“公开”阶段,当各方宣布明文种子时,智能合约会验证它们是否正确,然后使用种子生成一个随机数。

提交-披露方法的更好实现是Randao。提交-披露可以与将来的哈希结合使用,以使其更加安全。

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


推荐阅读
author-avatar
2yuheng
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有