抽奖摇号系统随机性算法介绍
参考视频教程:
**高并发高性能 Go语言开发企业级抽奖项目 **
- 摘要
=====
本文分析GO语言包中的"crypto/rand"和"math/rand",芯链HPB系统的区块链随机数,并给出了权衡效率和随机性,并给出了一款区块链摇号抽奖系统如何实现随机数的算法和流程。
- 背景知识
=======
2.1 真随机和伪随机概念
根据密码学原理,要想对一个"随机数"进行随机性检验有以下几个标准:
- 统计学伪随机性 - 在给定的随机比特流样本中,1 的数量大致等于 0 的数量,也就是说,“10""01""00""11” 四者数量大致相等。说人话就是:“一眼看上去是随机的”。
- 密码学安全伪随机性 - 就是给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。
- 真随机性 - 其定义为随机样本不可重现。
根据以上几个标准,其对应的随机数也就分为以下几类:
- 伪随机数 - 满足第一个条件的随机数。
- 密码学安全的伪随机数 - 同时满足前两个条件的随机数。可以通过密码学安全伪随机数生成器计算得出
- 真随机数 -同时满足三个条件的随机数
2.2 GO语言包的随机函数包介绍
2.2.1 math/rand 包
math/rand 包实现了伪随机数生成器,就是如果使用相同的种子来生成两个 Rand 实例,对这两个实例进行相同次序和函数的调用,那么将会得到两串 完全相同 的输出。如果两个 Rand 对象使用了不同的值来做种子,就不具有这种相同的行为了。但是math/rand 包在接口丰富性和效率方面比较好。
2.2.1.1 主要方法
(1)func Seed(seed int64)
设置随机种子,不设置则默认Seed(1)
(2)func Intn(n int) int
返回一个取值范围在[0,n)的伪随机int值,如果n<=0会panic
(3)func Perm(n int) []int
返回一个有n个元素的,[0,n)范围内整数的伪随机排列的切片
2.2.1.2 应用场景
(1)验证码
(2)随机密码
(3)抽奖
(4)随机算法
2.2.2 crypto/rand 包
crypto/rand 包实现了用于加解密的更安全的随机数生成器,其中有个变量 Reader io.Reader。Reader是一个全局、共享的密码用强随机生成器。在Unix类型系统中,会从/dev/urandom读取,而windows中会调用CryptGenRandom API。
在Unix 内核中的随机数发生器(/dev/random),理论上它能产生真随机。即这个随机数的生成,独立于生成函数,这时我们说这个随机数发生器是非确定的。具体来讲,Unix 维护了一个熵池,不断收集非确定性的设备事件,即机器运行环境中产生的硬件噪音,来作为种子。比如说,时钟,IO 请求的响应时间,特定硬件中断的时间间隔,键盘敲击速度,鼠标位置变化,甚至周围的电磁波等等……直观地讲,你每按一次键盘,动一下鼠标,邻居家 wifi 信号强度变化,磁盘写入速度等等信号,都可能被用来生成随机数。更具体的,内核提供了向熵池填充数据的接口,比如鼠标的大概就长成这样:void add_mouse_randomness(__u32 mouse_data) 内核子系统和驱动调用这个函数,把鼠标的位置和中断间隔时间作为噪音源填充进熵池。
在Windows环境中,一个健壮的随机函数是:CryptGenRandom(),定义在Wincrypt.h。CryptGenRandom从Windows2000的众多的资源中,获得其随机性[也称作"熵"(entropy)]:①当前进程的ID;②当前线程的ID;③系统引导以来的时钟数;④各种高精度的性能计数器;⑤用户环境模块的MD4(Message Digest 4,信息摘要4)散列,包括用户名,计算机名和搜索路径等;⑥高精度的内部CPU计算器,如RDISC,ROMSR,RDPM等;⑦底层系统信息,如空闲时间,内检时刻,中断时间,提交限定,页面计数,缓存计数,操作系统外部计数等。
CryptGenRandom跟硬件关联,具有真正的随机性和不可预测性。
2.2.2.1 主要方法
(1)func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)
返回一个在[0, max)区间服从均匀分布的随机值,如果max<=0则会panic
(2)func Prime(rand io.Reader, bits int) (p *big.Int, err error)
返回一个具有指定字位数(二进制的位数)的数字,该数字具有很高可能性是质数(除了1和它自身外,不能被其他自然数整除的数叫做质数)。如果从rand读取时出错,或者bits<2会返回错误
(3)func Read(b []byte) (n int, err error)
本函数是一个使用io.ReadFull调用Reader.Read的辅助性函数。当且仅当err == nil时,返回值n == len(b)
2.2.2.2 应用场景
(1)生成随机加密串
2.3 HPB区块链系统的随机数介绍
2.3.1 HPB 随机数生成器
HPB 随机数生成器是架构在区块链的一种基础服务。随机数的实际实生产者为所有高性能节点(矿机)。随机数服务的产生依赖与区块链提供的共识服务和数据同步服务。如下图 1 所示,HPB随机数生成器有三层架构:随机数种子生成层,随机数计算层(验证层)和随机数调用层。
- 随机数种子层负责产生硬件随机数种子,种子层一般有硬件担任。
- 随机数计算层读取硬件随机数种子,将其写入每一个区块中,并收集之前区块中的种子,在共识算法的带动下生成最终的随机数。同时使用 VRF1可验证函数辅助进行动态种子周期变换保证随机数安全,以防止任意一个或者多个的随机数生产者的攻击。
- 随机数接口层提供了随机数读取接口,方便用户使用。
2.3.2 HPB接口方式获取随机数
HPT区块链系统可以通过RPC接口获取历史随机数。
**1,接口定义 **
(1)通过RPC接口获取历史随机数
接口名称 :hpb_getRandom
参数 :块号 ,整形数字或者字符串"latest"
返回值:随机数,string,
(2)使用"latest"查询最新块中的随机数
调用示例:
curl -X POST -H “Content-Type: application/json” –data
‘{“jsonrpc”:“2.0”,“method”:“hpb_getRandom”,“params”:[“latest”],“id”:1}’ http://127.0.0.1:8545
返回示例:
{“jsonrpc”:“2.0”,“id”:1,“result”:“0x45e5b62b748859b8eaf245406f5734244c5fef80d65f973b0a96407cf733db5
1”}
(3)查询指定块号的随机数
调用示例:
curl -X POST -H “Content-Type: application/json” –data
‘{“jsonrpc”:“2.0”,“method”:“hpb_getRandom”,“params”:[“0x3f21”],“id”:1}’ http://127.0.0.1:8545
返回示例
{“jsonrpc”:“2.0”,“id”:1,“result”:“0x45e5b62b748859b8eaf245406f5734244c5fef80d65f973b0a96407cf733db5
1”}
2.3.3 HPB智能合约方式获取随机数
HPT区块链系统可以通过通过智能合约使用最新随机数;
在智能合约中使用最新的随机数,方式十分简单,只需要调用block.random即可返回随机数。
合约需要使用HPB官方的solidity编译器进行编译才能生效。
**合约示例 **
pragma solidity ^0.5.1;
contract MYTEST{bytes32 random;function getrandom()public {random = block.random;}function print() view public returns(bytes32){return random;}
}
上述合约示例通过在HPB主网上部署后,执行getrandom函数,则将最新的随机数写入random变量。然后通过
print函数打印随机数。
- 实现方案
=======
3.1 随机数算法选择
在生活中,抽奖摇号无所不在,涉及经济、民生、教育、医疗、政务、住房、养老和娱乐等各个领域,如口罩预约摇号、彩票抽奖、车牌摇号、股票打新、入学摇号、新房摇号。参与大众关心抽奖摇号系统的公平透明公正性,担心这些系统是否因为中心化人为控制的原因,导致形成潜在的利益输送,丧失抽奖摇号本身宣传的公平透明公正的原则。
那么,开发一款区块链抽奖摇号系统,利用HPB区块链真随机数、时间可信、内容不可篡改、数据可追溯可查询等特性,可以解决大众的担忧,实现真正的公平。
3.2 摇号的算法流程
3.3 抽奖的算法流程
抽奖摇号系统随机性算法介绍相关推荐
- C#WinForm应用程序——简易摇号系统
去年班级元旦晚会制作的要好系统,一直都忘记把代码贡献出来,把制作方法和大家说一下. 元旦party的logo是sxy同学制作的 界面背景是zlq同学制作的 最后效果图 功能介绍: 点击开始,可以在&q ...
- SSM SpringBoot vue限房摇号系统
SSM SpringBoot vue限房摇号系统 SSM限房摇号系统功能介绍 首页 房源信息 我的收藏 登录注册 个人中心 后台管理 登录注册 个人中心 户型信息管理 面积信息管理 地段信息管理 房企 ...
- 哈尔滨车牌摇号系统遭遇黑客攻击瘫痪
今天(6月20日),素有冰城美誉的哈尔滨本应于上午九点开始互联网机动车选号,不料遭黑客攻击,导致系统崩溃.为了防止大量号牌流入非法渠道,哈尔滨市公安交通警察支队接到上级机关通知决定暂缓开通互联网选号系 ...
- WZOI-301车牌摇号系统
题目描述: 汽车数量的急剧增加,导致城市交通的压力越来越大,许多大城市采取通过摇号方式来发放汽车车牌.在申请人通过资格审核后,车牌摇号系统反馈回一个唯一的编号.每次摇号前,车牌摇号系统需要收集所有本次 ...
- 摇号系统 - 【python】
摇号系统 需求 需要一个摇号系统 40人摇摊位 人员确定 其中部分人员需要了多个摊位 摊位号按照顺序排列显示 比如说张三需要一个摊位,李四需要两个,王五需要一个. 第一次摇出来王五,屏幕显示" ...
- 北京摇号系统服务器,支付宝“城市服务”平台可查询北京小客车摇号结果
支付宝"城市服务"平台可查询北京小客车摇号结果 [TechWeb报道]9月7日消息,北京市交通委与支付宝达成合作,市内交通出行服务将登陆城市服务平台.市民在手机上进入支付宝&quo ...
- java摇号_java语言实现一个摇号系统,但是可以内部设定中奖名单这个怎么实现?...
展开全部 1.简单控制台程序如下,如需界面需要自己加个. package zhidao; import java.util.HashSet; import java.util.Random; impo ...
- 基于JAVASE的彩票摇号系统
模拟双色球彩票系统 1. 双色球规则: a) 双色球分为红球和蓝球,红球选择的范围为 1-33 而且红球选择 6 个数字,蓝球 1-16 而且只能选择一个. b) 选择方式为 随机选择和手动输入选择号 ...
- 利用C#写一个模拟的摇号系统
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
最新文章
- 想在VR中体验暴雪爸爸的游戏,还得再等等
- 4.空悬指针和野指针
- python中的多进程与多线程(二)
- ICLR 2022 | Transformer不比CNN强!Local Attention和动态Depth-wise卷积
- Eclipse新建Android项目后,出现“The import android.support.v7.app cannot be resolved”
- Netty-案例 WebSocket与netty实现长连接案例(代码注释详解)
- 菜鸟入门【ASP.NET Core】5:命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options...
- Hadoop环境搭建 MYSQL环境配置
- C#winform之自定义按钮形状(初级版)
- Python中格式化操作漂亮打印文件的读取和写入
- 在北京这种城市,周末假期怎么整才算浪......
- win10linux系统双系统,win10安装linux双系统的方法是什么_win10装linux双系统的方法...
- 特聘专家朱嘉明:2022,数字经济迈入历史新阶段
- NPOI导出一行多张图片
- 孟婆汤传说!!!感人至极!
- MBR与GPT分区的区别及使用注意事项(转载)
- 在交通监控中使用基于计算机视觉的事故检测方案
- 纯css实现粒子效果
- JAVA 相关 官方网站
- 上证50基金有哪些_上证50指数基金,最全选购攻略