Solidity随机数发生器原理与实现
1、什么是随机数
想象一下你身边的随机噪音或者任何随机发生的事情,可以说检测到这些随机模式 的概率为0。这就是随机数的意思 —— 一个可以生成指定范围内的任意不确定 数字的模式。
当我这么说的时候,考虑一下1~100之间的某个数。由于不确定性,我 猜不出来你的脑子里现在想的是哪个数。
随机数是从某个特定分布中选中的数,通常也会要求这些数之间彼此独立, 这样在前后两个数之间就不会存在相关性。计算机生成的随机数有时会 称为伪随机数,这一术语中保留了随机,表示其不可预测性。当没有额外 的约定时,通常随机数采样自均匀分布。当然也可以使用其他的概率分布, 例如,Box-Muller变换可以将一对满足均匀分布的随机数转换为一个二维 正态分布。
2、什么是伪随机数
伪随机数也被称为确定性随机位。这些数是使用被称为伪随机数发生器/PRNG 的计算机算法生成的,它们是确定性的,因此并不是真的随机,这些伪随机数 在经过一定的序列之后可能会重复。
为了生成随机数,我们需要使用一个数来初始化算法,这个数被称为种子/SEED。 通常使用补齐的系统时间作为种子,为了确保这些伪随机数有足够的随机性, 我们会加一些盐/SALT或糖/SUGAR—— 可以将它视为你的伪随机数的密码 —— 以避免哈希 碰撞,也就意味着会生成重复的数。
3、区块链上如何实现伪随机数发生器
从前面的描述中,我们知道计算机里的随机数并不是真的随机,并且至少需要 一个系统时间来初始化算法,如果你要用它来开发某些有很强的随机要求的应用, 例如博彩游戏、计算机仿真、密码学等,这就有可能发生哈希碰撞。
这就是为什么在区块链上基本上不可能生成随机数的原因,我们需要获取 区块时间或区块哈希之类的作为种子,由于早期第一代和第二代区块链的出块 速度很慢,那么发生哈希碰撞的机会非常大。
但是,第三代的区块链已经可以达到很快的出块速度了,比如0.5~1秒,这样 我们就可以利用区块时间戳或区块哈希来初始化伪随机数发生器。
3、Solidity随机数发生器
下面的Solidity合约代码展示了如何在以太坊区块链上实现一个Solidity随机数发生器。
你可以说这是一个真随机数发生器/TRNG,因为我们没有使用算法 来生成随机数,而只是将区块时间与种子、盐、糖组合后计算哈希。我们 选择的这三个值可以是相同的并且是确定性的,但是区块哈希是不确定性的。 下面的代码支持以太坊、波场或其他任何支持Solidity的第三代区块链:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
pragma solidity ^0.5.8;/*** @title True random number generator* @notice This is a contract to generate a true random number on blockchai.* Though true random number generators doesn't require seed. But, to simplify* the functions i used seed and other terms used in PRNGs,* seed should be enough to generate a random number, but to randomize the pattern* even more i added two more functions with salt and sugar.*/ contract PRNG {/*** @notice Generates a random number between 0 - 100* @param seed The seed to generate different number if block.timestamp is same* for two or more numbers.*/function importSeedFromThird(uint256 seed) public view returns (uint8) {uint8 randomNumber = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, seed))) % 100);return randomNumber;}/*** @notice Generates a random number between 0 - 100* @param seed The seed to generate different number if block.timestamp is same* for two or more numbers.* @param salt The salt to randomize the pattern*/function importSeedFromThirdSalt(uint256 seed, uint256 salt)publicviewreturns (uint8){uint8 randomNumber = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, seed, salt))) % 100);return randomNumber;}/*** @notice Generates a random number between 0 - 100* @param seed The seed to generate different number if block.timestamp is same* for two or more numbers.* @param salt The salt to randomize the pattern* @param sugar The sugar same as salt but for more randomization*/function importSeedFromThirdSaltSugar(uint256 seed,uint256 salt,uint256 sugar) public view returns (uint8) {uint8 randomNumber = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, seed, salt, sugar))) % 100);return randomNumber;} } |
在上面的合约中,我们实现了三个函数,分别使用不同的参数生成Solidity随机数:
- importSeedFromThird:只需要种子的Solidity随机数发生器
- importSeedFromThirdSalt:需要种子、盐的Solidity随机数发生器
- importSeedFromThirdSaltSugar:需要种子、盐、糖的Solidity随机数发生器
abi.encodePacked
以不对齐的方式将数据打包。 eccak256
哈希函数和sha3
类似,只是采用不同的补齐模式,具体可以参考这里。
因此,在上面的函数中,我们实际上将包含时间、种子、盐、糖的数据进行了编码 从而获得更强的随机性,并尽可能让随机数不可预测。 当然我们可以从上面函数实现中删除时间戳,但是这样的话,我们就 完全控制了随机数的发生,从而破坏了区块链的透明特性。
原文链接:Random Number Generation on Blockchain
Solidity随机数发生器原理与实现相关推荐
- OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用
基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...
- Linux随机数发生器
Linux随机数发生器 日期:2017-11-29 01:42:10 星期三 Linux随机数发生器 一.源代码的基本情况 Linux内核版本 涉及文件 功能概述 二.外部访问接口 内核层输出接口 用 ...
- 量子计算机真随机数,量子真随机数发生器研究取得进展
量子真随机数发生器研究取得进展 超高速真随机数发生器简化设计方案(上)与后处理方法(下) 信息科学技术学院郭弘教授课题组与物理学院张建玮副教授课题组开展合作,在用光学随机源设计研制量子真随机数发生器的 ...
- OpenCV 【十六】RNG随机数发生器putText绘制文字
1 目的 使用 随机数发生器类 (RNG) 并得到均匀分布的随机数. 通过使用函数 putText 显示文字. 第一步是实例化一个 Random Number Generator(随机数发生器对象) ...
- c51汇编语言随机数函数,汇编语言随机数发生器
我最近开始学习汇编语言.对于我正在研究的项目,我必须使用线性一致性来生成随机数生成器.我想拿三个数字.上限,下限和我想要的随机数的数量.如式为获得一个随机数,我想出了....汇编语言随机数发生器 ra ...
- 【STM32】随机数发生器相关函数和类型
00. 目录 文章目录 00. 目录 01. RNG概述 02. 相关类型 03. 相关函数 04. 结构体封装 05. 预留 06. 附录 07. 声明 01. RNG概述 RNG 处理器是一个以连 ...
- 【STM32】随机数发生器详解
00. 目录 文章目录 00. 目录 01. 随机数发生器简介 02. 随机数发生器主要特性 03. 随机数发生器功能说明 04. 随机数发生器操作 05. 随机数发生器寄存器 5.1 RNG 控制寄 ...
- Java中随机数的原理,以及使用时的注意点
转载自 Java中随机数的原理,以及使用时的注意点 1 前言 一提到 Java 中的随机数,很多人就会想到 Random,当出现生成随机数这样需求时,大多数人都会选择使用 Random 来生成随机 ...
- 随机数发生器怎么用_用随机数发生器射击自己的脚
随机数发生器怎么用 这将不是解释随机数生成器毕竟不是那么随机的文章之一. 因此,您中的那些人希望获得有关如何破解老虎机,继续前进的指南,在这里什么也看不到. 相反,它是有关一个不太常见的锁争用问题的帖 ...
最新文章
- Excel-姓名列中同一个人汇总金额列,得出总金额
- MATLAB编程与应用系列-第2章 数组及矩阵的创建及操作(4)
- php读取屏幕大小,jQuery 获取屏幕尺寸
- HDU - 4866 Shooting(主席树+扫描线)
- ap计算机科学4分还要再考吗,CB官方发布2020年AP计算机科学考试(CSA)的细节:考试时间/考试题型/备考资料/评分标准/考前建议...
- 再过十年,电脑游戏会被手机游戏完全取代吗?
- 宿舍电源额定500w,我的电脑550w的,有什么办法能解决吗?
- org.apache.commons.fileupload.DiskFileUpload
- kali linux 添加字体,在kali linux之下安装wps之后 报错字体缺失
- STM32CubeIDE HAL库微秒us的延时Delay实现
- 图片上打印汉字(C++、OPENCV+字库)
- let与var的区别(重点看例子)
- 指针分配和释放空间(转)
- 支付宝微信在刷脸支付领域两强争霸
- Linux环境准备五---VMWare打开CentOS虚拟机报错VT(长模式不兼容)等错误的解决方案
- 上帝在基督里赦免了所有人的罪
- 计算机网络之五层体系结构
- 【Leetcode】526. Beautiful Arrangement
- EMIS快速开发平台 - 微服务版技术选型
- html中 cookie设置