抽奖摇号系统随机性算法介绍

article/2025/8/31 3:23:57

 
参考视频教程:  
 **高并发高性能 Go语言开发企业级抽奖项目  **

  1. 摘要
    =====

本文分析GO语言包中的"crypto/rand"和"math/rand",芯链HPB系统的区块链随机数,并给出了权衡效率和随机性,并给出了一款区块链摇号抽奖系统如何实现随机数的算法和流程。

  1. 背景知识
    =======

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随机数生成器有三层架构:随机数种子生成层,随机数计算层(验证层)和随机数调用层。

  1. 随机数种子层负责产生硬件随机数种子,种子层一般有硬件担任。
  2. 随机数计算层读取硬件随机数种子,将其写入每一个区块中,并收集之前区块中的种子,在共识算法的带动下生成最终的随机数。同时使用 VRF1可验证函数辅助进行动态种子周期变换保证随机数安全,以防止任意一个或者多个的随机数生产者的攻击。
  3. 随机数接口层提供了随机数读取接口,方便用户使用。

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函数打印随机数。

  1. 实现方案
    =======

3.1 随机数算法选择

在生活中,抽奖摇号无所不在,涉及经济、民生、教育、医疗、政务、住房、养老和娱乐等各个领域,如口罩预约摇号、彩票抽奖、车牌摇号、股票打新、入学摇号、新房摇号。参与大众关心抽奖摇号系统的公平透明公正性,担心这些系统是否因为中心化人为控制的原因,导致形成潜在的利益输送,丧失抽奖摇号本身宣传的公平透明公正的原则。

那么,开发一款区块链抽奖摇号系统,利用HPB区块链真随机数、时间可信、内容不可篡改、数据可追溯可查询等特性,可以解决大众的担忧,实现真正的公平。

3.2 摇号的算法流程

3.3 抽奖的算法流程


http://chatgpt.dhexx.cn/article/HfeFHf9j.shtml

相关文章

Windows 安装 JDK-11

目标 在 windows 上安装 JDK-11 安装 下载 JDK 安装包 地址下载https://download.csdn.net/download/m0_47406832/83449704 解压 安装 运行 jdk-11.0.11_windows-x64_bin.exe 程序&#xff0c; 许可安装请求 等待环境检测 开始安装 选择安装目录 接下来一路下一步&…

Win10安装JDK11(超详细)

目录 一、下载JDK二、安装JDK三、配置环境变量四、检查是否安装成功五、JDK中没有jre文件 一、下载JDK JDK11下载地址&#xff1a; Java SE Development Kit 11.0.19 下图是JDK11下载界面&#xff1a; 其中.exe后缀的是安装版本&#xff0c;需要手动设置安装路径进行安装&am…

JDK11安装-macos

JDK 概述 JDK 全称 Java Development ToolKit&#xff0c;是 Java 语言开发工具包。JDK 是整个 JAVA 的核心&#xff0c;包括了 Java 运行环 境&#xff08;Java Runtime Environment&#xff09;&#xff0c;一堆 Java 工具&#xff08;javac/java/jdb 等&#xff09;和 Java…

jdk9、jdk10、jdk11、jdk12、jdk13新特性

我们绝大部分人估计都还在用着jdk8&#xff0c;12其实是一个非LTS&#xff08;long time support&#xff09;版本&#xff0c;而11与8一样是LTS版&#xff0c;意味着下个通用的版本将从8直接到11&#xff0c;毕竟11包含了9和10的所有新特性&#xff0c;因此9和10估计就直接被废…

window11安装JDK1.8【jdk-8u121】

&#x1f469;‍&#x1f4bb;博客主页&#xff1a;大家好我是poizxc2014的博客主页 ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f4d6;个人主页&#xff1a;poizxc2014的博客_CSDN博客-数据库,mysql,java领域博主 &#x1f4bb;首发时间&#xff1a;&#…

JDK11 新特性详解

1、增强局部变量类型推断 var Consumer<String> consumer t -> System.out.println(t.toUpperCase()); Consumer<String> consumer (var t) -> System.out.println(t.toUpperCase());错误的形式&#xff1a;必须要有类型&#xff0c;可以加上var Consumer…

JDK11安装教程(WIN10)

文章目录 前言一、Java是什么&#xff1f;二、搭建Java环境1.下载2.安装3.配置环境变量4.检验是否安装成功 总结 前言 从毕业到工作已经快一年了&#xff0c;这一年来&#xff0c;公司给我的发展方向是项目经理&#xff0c;但是第一&#xff0c;工作地点离家太远&#xff1b;第…

【JDK】win 10 / win 11:jdk 8 下载、安装、配置、验证

目录 一、下载 JDK &#xff08;1&#xff09;官网下载 JDK 最新版本 &#xff08;2&#xff09;官网下载 JDK 历史版本&#xff08;示例 Java 8&#xff09; 二、安装 JDK &#xff08;1&#xff09;新建安装目录 jdk 和 jre &#xff08;2&#xff09;启动安装程序 &a…

【JDK】win 10 / win 11:jdk 8 升级为 jdk 17

目录 一、前言 二、历史版本 Java 安装 三、最新版本 Java 安装 &#xff08;1&#xff09;历史版本作废 &#xff08;2&#xff09;最新版本沿用旧版 JDK 系统环境变量 &#xff08;3&#xff09;JDK 17 下载 &#xff08;4&#xff09;JDK 17 安装 &#xff08;5&am…

Windows下安装JDK11(详细版)

简介 在JDK1.8之后的下一个稳定版本就是JDK11&#xff0c;所以下面教大家安装JDK11 第一步:下载 官网下载地址[https://www.oracle.com/java/technologies/javase-jdk11-downloads.html] 拉至页面到底部&#xff0c;选择如下版本下载&#xff0c;然后它可能要Oracle帐号才能…

Windows下安装JDK11(详细)

文章目录 一、简介第一步&#xff1a;下载第二步&#xff1a;安装第三步&#xff1a;设置环境变量第四步&#xff1a;生成 jre 文件第五步&#xff1a;检查是否成功 一、简介 因为JDK1.8版本已经不维护且比较老&#xff0c;故选用下一个稳定的版本&#xff0c;即JDK11。 第一…

win10安装jdk11

win10安装jdk11 jdk11下载与安装下载手动安装免安装配置系统环境变量检测是否安装成功 切换jdk版本 jdk11下载与安装 下载 1.第一步&#xff0c;前往oracle官网下载jdk11 oracle官方下载地址 2.选择要下载的jdk x64 Installer&#xff1a;这个是需要手工安装的版本 x64 Com…

jdk11下载与安装教程(win10)超详细

一、下载安装步骤 1、官网下载还需要注册&#xff0c;可以点【我的网盘】目录下载&#xff0c;密码3360&#xff0c;目录也有其它低版本的&#xff0c;如果有需要大家根据需要自行选择。 2、下载后直接点击安装程序&#xff0c;点击【运行】。这里我使用的是64位的。 3、点击【…

JDK11下载安装、JRE生成、环境配置

一、 下载 JDK11官网下载&#xff1a; Java SE - Downloads | Oracle Technology Network | Oracle 选择自己合适的版本。 二、安装 三、生成JRE 1、安装目录 找到jdk的安装目录 2、jdk11安装目录里面我们可以看到是没有jre的&#xff0c;但是我们在之后可能是会需要用到…

JDK11下载与安装 win10 64位

Java11 为LTS(长期支持)版本。 1.下载JDK11 建议直接找安装包&#xff0c;不要去官网下载。 下面是 jdk11的下载地方 方法1&#xff1a;百度网盘链接&#xff1a;https://pan.baidu.com/s/11yQTrDv653hceNA-wfcFsg 提取码&#xff1a;qgfk 方法2&#xff1a;阿里云盘&#xff1…

2020年最新 java JDK 11 下载、安装与环境变量配置教程

java JDK11下载、安装与环境变量配置 一、下载步骤 首先明确自己的操作系统&#xff08;本次配置jdk操作系统&#xff1a;Windows 10 家庭中文版&#xff09; 下载地址&#xff1a;点击跳转 点击进入下载地址后我们可以看见目前&#xff08;2020/8/15&#xff09;最新版本是…

Win10安装jdk11及环境变量配置

Win10安装jdk11及环境变量配置 写在前面卸载旧版本jdk下载jdk11配置环境变量经验教训 写在前面 我第一次安装java是在17年初&#xff0c;距离现在已经一年半了。今天上oracle官网一看&#xff0c;jdk都已经更新到11.0.1了&#xff0c;然而我用的还是1.8.0_171版本的老古董&…

jdk11下载、安装及环境配置详解(win10环境)

目录 一、jdk11下载1.1、官网下载网址1.2、官网下载步骤 二、jdk11安装&#xff08;win10环境&#xff09;三、jdk11环境变量配置&#xff08;win10环境&#xff09;3.1、jdk11环境变量配置步骤3.2、jdk11环境变量验证步骤 一、jdk11下载 1.1、官网下载网址 https://www.orac…

JDK11 下载与安装、环境配置(全网最详情,值得收藏)

目录 一、下载JDK11 二、安装JDK11 三、配置环境变量 四、验证环境配置是否成功 五、答疑&#xff0c;为什么不配置 CLASSPATH 什么是JDK JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0…

jdk11 下载与安装(非常详细,一步不落!!!)

文章目录 前言 一、下载jdk11 二、安装jdk 三、配置环境变量 总结 前言 JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff0…