H 发表于 2026-1-2 20:51:02

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]@

老衲先射了 发表于 2026-1-2 21:18:00

支持大佬

H 发表于 2026-1-3 09:10:32

不错

williamc2 发表于 2026-1-5 10:47:32

支持支持

q9.gs 发表于 2026-1-5 13:15:46

https://mylt.net/向你学习。

bababean 发表于 2026-1-5 13:42:31

感谢楼主的分享,顶起来给其他人看到

Musk 发表于 2026-1-5 13:44:03

学习了,不错,感谢分享
页: [1]
查看完整版本: Xiuno BBS 幸运抽奖插件开发教程