资讯专栏INFORMATION COLUMN

以太坊solidity智能合约-生成随机数

meislzhua / 1035人阅读

摘要:对于来说通过复杂的算法生成随机数成本太高,同时智能合约又运行在多个节点上,因此,不能使用像时钟时间来生成随机数。在获得随机数之后,针对随机数取值范围进行取模操作,获得最终的随机数。

Solidity随机数生成

在以太坊的只能合约中,没有提供像其他面向对象编程一样的生成随机数的工具类或方法。其实,所谓的随机数也是伪随机的,没有哪一种语言能够真正的生成随机数。

对于solidity来说通过复杂的算法生成随机数成本太高,同时智能合约又运行在多个节点上,因此,不能使用像时钟时间来生成随机数。

solidity随机数生成过程

在此使用最常用的算法之一是“线性同余发生器”(LCG)。基本步骤如下:

接收输入

基于输入执行算法

取输出模数(除以需要范围内的最大数量)。

function rand(uint256 _length) public view returns(uint256) {
    uint256 random = uint256(keccak256(abi.encodePacked(block.difficulty, now)));
    return random%_length;
}

比如上面的代码,通过一系列算法获得类型为uint256的random数据,然后对random取模指定的长度,即可得到一个随机数。其中_length的参数为你想去随机数的范围,比如要取0-10的随机数,那么_length的长度便为10。

在以上方法中第一步通过abi.encodePacked(...) returns (bytes)用来计算参数的紧密打包编码。然后通过keccak256算法对其结果进行hash计算,最后转换成uint256的类型。在获得随机数之后,针对随机数取值范围进行取模操作,获得最终的随机数。

需要注意的是在solidity ^0.4.0版本中还可以直接使用keccak256对多个参数进行加密,但在0.5.10版本中keccak256只能提供一个参数。所以要使用abi.encodePacked进行处理。

原文链接:https://www.choupangxia.com/2...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75747.html

相关文章

  • 盘他!以太合约的安全性弱点II

    摘要:今天,我们继续介绍文献中提到的以太坊合约的安全性弱点与案例。随机数生成的字节码执行是确定性的。但是,一个恶意的矿工可能尝试操纵自己生成的区块来影响随机数的生成与合约的执行结果。合约中的钱将被偷走。 今天,我们继续介绍文献中提到的以太坊合约的安全性弱点与案例。 数据保密Solidity 智能合约中的变量分 public 和 private 两种。Private 变量表示这个数值不能被其他...

    MRZYD 评论0 收藏0
  • 以太:Dapp及相关开发工具介绍

    摘要:邮件列表以太坊上的开发者邮件列表停止使用。开发的移动以太坊浏览器开发阶段由支持的浏览器内。是以太坊的开发环境,测试框架和资产管道。审查随机数以太坊虚拟机是以太坊智能合约的执行环境。 去中心化应用去中心化应用是可以使用户和供应商之间直接互动的服务(例如,连接某些市场上的买方和卖方,文件存储里的持有者和储存者)。以太坊去中心化应用典型地通过HTML/Javascript网络应用与用户互动,...

    FleyX 评论0 收藏0
  • SegmentFault 技术周刊 Vol.41 - 深入学习区块链

    摘要:和比特币协议有所不同的是,以太坊的设计十分灵活,极具适应性。超级账本区块链的商业应用超级账本超级账本是基金会下的众多项目中的一个。证书颁发机构负责签发撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 从比特币开始 一个故事告诉你比特币的原理及运作机制 这篇文章的定位会比较科普,尽量用类比的方法将比特币的基本原理讲出来...

    qianfeng 评论0 收藏0
  • 以太开发实战学习-Solidity初学(一)

    摘要:可以把账户视为银行账户,以太币就是以太坊生态系统中的货币。重点合约状态是持久化到区块链上的,因此对合约状态的修改需要消耗以太币。也就是说它们被写入以太币区块链中想象成写入一个数据库。注中,实际上是代名词,一个位的无符号整数。建立一个命名为。 区块链火热,作为程序猿的我,当然也不能袖手旁观,一位资深技术开发朋友曾笑说:这是屌丝程序猿改变命运为数不多的机会之一。所以,从今天开始,就要步入区...

    googollee 评论0 收藏0
  • 2018以太智能合约编程语言solidity的最佳IDEs

    摘要:使用基于以太坊的智能合约的集成开发环境。以太坊教程,主要介绍智能合约与应用开发,适合入门。以太坊,主要是介绍使用进行智能合约开发交互,进行账号创建交易转账代币开发以及过滤器和事件等内容。 Solidity是一种以智能合约为导向的编程语言。这是一种只有四年的年轻语言,旨在帮助开发基于以太坊数字货币的智能合约。 理解它官方文档应该是学习Solidity的最佳来源:solidity.read...

    darkerXi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<