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/2019/08/01/以太坊solidity智能合约-生成随机数/


程序新视界
关注程序员的职场生涯,大量优质学习资源、技术文章分享

以太坊solidity智能合约-生成随机数相关推荐

  1. 基于以太坊的智能合约开发教程Solidity modifier

    基于以太坊的智能合约开发教程Solidity modifier pragma solidity ^0.4.0;contract modifierTest{address owner;uint publ ...

  2. java计步器算法_区块链+计步运动项目,主要采用以太坊、智能合约、springboot以及小程序等技术...

    runlife_api 项目介绍 区块链+计步运动项目,主要采用以太坊.智能合约.springboot以及小程序等技术 兑换步数算法 按照每总量剩余一半的时候兑换难度增加一倍,如目前按照平均步数511 ...

  3. 以太坊EVM智能合约中的数据存储

    目录 EVM基本信息 数据管理 Stack Args Memory Storage 固定长度的值 动态长度数组 Mappings 复杂类型的组合 总结 EVM基本信息 以太坊是一种基于栈的虚拟机,基于 ...

  4. 以太坊系列 - 智能合约开发与调试

    本文默认智能合约所需要的相关环境Geth.Truffle.Solidity.Ganache等都是完备的! 主要介绍: Remix IDE环境如何与指定的链进行连接: 编译 部署与调试智能合约 使用 z ...

  5. 以太坊Python智能合约开发指南

    在以太坊上获得一个基本的智能合约是一个很简单的事,只需google查询"ERC20代币教程",你会发现有关如何做到这一点的大量信息.以编程方式与合约交互完全是另一回事,如果你是一个 ...

  6. 以太坊投票智能合约案例

    这个例子相对复杂一些,用到了以太坊编程语言Solidity的很多特性.例子实现了一个投票智能合约.电子投票系统的一个主要问题是如何分配合理的权限给正确的人,并且要防止篡改.这个例子不能解决所有问题,但 ...

  7. python如何使用web3py与以太坊投资智能合约交互

    在以太坊和其他区块链中,仍有很多被证明的概念正在实施,开发人员在尝试如何应对这些新概念.作为dInvest 系列文章一部分,我也在研究以太坊并尝试在区块链中实施对冲基金.在上一篇文章中,我讨论了如何在 ...

  8. 区块链工作原理(区块链治理系统、比特币、以太坊、智能合约)

    文章目录 Blockchain Governance System On-Chain Governance Off-Chain Governance BitCoin Blockchain Ethere ...

  9. 使用C# 和基于.Net的以太坊库Nethereum以太坊及智能合约交互实战篇(一)

    官网:Nethereum官网 Github地址:Github上的Nethereum库 简介: Nethereum是用于Ethereum的.Net集成库,可简化智能合约管理以及与以太坊节点的交互,无论这 ...

最新文章

  1. 电脑温度检测软件哪个好_一般电脑录音软件哪个好?
  2. 服务器更换硬盘+内存
  3. 【 MATLAB 】基本序列运算及其MATLAB的等效表示
  4. python自带库处理excel-【Python】处理Excel的库Xlwings
  5. 软件调试学习笔记(三)—— 调试事件的处理
  6. 【Nignx】 nginx启动http服务,报错 curl: (56) Recv failure: Connection reset by peer
  7. 90%的程序员都写错的算法-二分查找万能模版
  8. 看懂堆排序——堆与堆排序(三)
  9. JS template string 神奇术
  10. pyecharts anaconda_Pyecharts安装使用和绘图案例
  11. wangeditor 请求头_跨域上传 · wangEditor2使用手册 · 看云
  12. Kaldi 语音识别基础教程
  13. AI早教产业鄙视链,你处在哪一层?
  14. console接口跟Telnet命令初步调试交换机
  15. 做移动网站还是移动应用程序?
  16. Python爬取童程童美TTS网站知识点图片
  17. vue-cli 项目踩坑 npm install 时出错
  18. 吉大计算机研究生996综合,996算什么?来看看研究生究竟有多累
  19. 电路基础6-(2)一阶电路
  20. 港人首次置业项目逾80%申请者属“80后、90后”

热门文章

  1. 垃圾回收分类系统、垃圾回收高保真原型设计 、垃圾分类后台管理系统、垃圾回收分类平台、垃圾回收分类、智慧管理系统、订单管理、财务管理、系统管理、库存管理、设备管理、Axure原型、rp原型
  2. 【设计模式】详解设计模式七大原则
  3. matlab对数函数ln5,ln5(ln55怎么算的求过程)
  4. c语言 m文件是什么,M文件扩展名 - 什么是.m以及如何打开? - ReviverSoft
  5. 强网杯2019(高明的黑客强网先锋上单)
  6. Vue-routers(步骤)
  7. 赛效:如何在线给图片加水印
  8. 无人机行业情况 - 亿航、大疆、极飞
  9. DSP6713 Simulator HelloWorld与LED
  10. 安卓逆向——某宝app爬虫抓取