Xiuno BBS 幸运抽奖插件开发教程
Xiuno BBS 幸运抽奖插件开发教程原文中有代码,但是论坛编辑器限制,发不上来,md格式转bbcode还是有点问题,在巴哈姆特找了一个工具https://arlenfuture.github.io/tools/markdown-to-bbcode/,大家有更好的可以分享一下
原文地址:点此进入
基于 Cloudflare drand 分布式随机信标的公正透明抽奖工具
前言
论坛经常需要举办抽奖活动,但传统抽奖方式存在公正性问题,用户无法验证抽奖结果是否被篡改。本文介绍如何在 Xiuno BBS 4.x 中实现一个公正透明、可验证的抽奖功能。
核心特性
li]公正性保证:使用 @ 分布式随机信标,信标只有在开奖时间到达后才能获取
可验证:任何人都可以通过 drand API 验证抽奖结果
纯前端算法:抽奖算法在浏览器端执行,后端仅提供评论数据
灵活配置:支持自定义开奖时间、中奖人数、起始楼层、排除重复用户等
效果预览
功能分为两个模式:
编辑模式:输入帖子 ID → 设置抽奖参数 → 生成抽奖链接
查看模式:显示配置 → 倒计时 → 自动开奖 → 展示中奖名单
实现原理
drand 随机信标
@drand 是由 Cloudflare、Protocol Labs 等组织共同维护的分布式随机数生成网络。它的特点是:
不可预测:在指定时间之前,无人能获取该时间的随机数
不可篡改:随机数由多个节点共同生成,任何单一节点无法操控
可验证:任何人都可以验证随机数的真实性
我们使用 drand 的 quicknet 链,每 3 秒产生一个新的随机信标。
抽奖算法
确定性随机数生成器 (PRNG)
使用 xorshift128+ 算法,确保相同的种子产生完全相同的随机序列:
文件结构
后端实现
数据查询函数 (model/bitsfloodlucky.func.php)
加载 model (hook/modelincfile.php)
添加路由 (hook/indexroutecaseend.php)
注意:Xiuno 的 message() 函数在某些情况下会输出 HTML 而非 JSON,所以这里直接使用 echo json_encode() + exit。
前端实现
核心 JavaScript (view/js/lucky.js)
由于代码较长,这里只展示核心部分:
#### drand 配置
#### 计算 drand round
#### 获取 drand 信标
#### Fisher-Yates 洗牌
#### 执行抽奖
页面模板初始化
URL 参数说明
抽奖链接格式:
| 参数 | 说明 | 示例 |
|------|------|------|
| thread | 帖子 ID | 123 |
| time | 开奖时间戳(毫秒) | 1767348480000 |
| count | 中奖人数 | 3 |
| start | 起始楼层 | 1 |
| duplicate | 是否允许重复 | false |
| mode | 模式 | view |
安装步骤
创建文件
将 bitsflood_lucky.func.php 放入 plugin/your_theme/model/
将 lucky.js 放入 plugin/your_theme/view/js/
创建 lucky.htm 页面模板
修改 hook 文件
在 model_inc_file.php 中 include model 文件
在 index_route_case_end.php 中添加路由
清空缓存
测试
访问 http://your-site.com/lucky.htm
输入帖子 ID,点击预览
设置参数,生成抽奖链接
验证抽奖结果
用户可以通过以下方式验证抽奖公正性:
查看 drand 信标
访问 https://api.drand.sh/{chain_hash}/public/{round}
确认 randomness 值与页面显示一致
重新计算
使用相同的参数和 randomness
执行相同的洗牌算法
结果必须完全一致
常见问题
Q: 为什么 API 返回 HTML 而不是 JSON?
Xiuno 的 message() 函数在非 AJAX 环境下会输出 HTML。解决方案:
Q: URL 构造错误怎么办?
PHP 的 url() 函数会添加 .htm 后缀。在 JavaScript 中构造 API URL 时需要移除:
Q: 如何支持大量评论?
API 使用分页加载(每次 100 条),前端会自动递归获取所有页面的数据。
总结
本文介绍了如何在 Xiuno BBS 中实现一个基于 drand 随机信标的公正抽奖功能。核心要点:
后端:提供评论数据 API,使用 echo json_encode() 输出
前端:通过 drand 获取随机信标,使用 xorshift128+ 和 Fisher-Yates 实现确定性洗牌
可验证:用户可通过 drand API 验证随机数真实性
希望这篇教程对你有帮助!如有问题欢迎交流讨论。
相关链接:
li]@
li]@
li]@
支持大佬 不错 支持支持 https://mylt.net/向你学习。 感谢楼主的分享,顶起来给其他人看到 学习了,不错,感谢分享
页:
[1]
