全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 154|回复: 1

Xiuno BBS 幸运抽奖插件开发教程

[复制链接]
H
发表于 昨天 20:51 | 显示全部楼层 |阅读模式
Xiuno BBS 幸运抽奖插件开发教程

原文中有代码,但是论坛编辑器限制,发不上来,md格式转bbcode还是有点问题,在巴哈姆特找了一个工具https://arlenfuture.github.io/tools/markdown-to-bbcode/,大家有更好的可以分享一下
原文地址:点此进入

基于 Cloudflare drand 分布式随机信标的公正透明抽奖工具


前言

论坛经常需要举办抽奖活动,但传统抽奖方式存在公正性问题,用户无法验证抽奖结果是否被篡改。本文介绍如何在 Xiuno BBS 4.x 中实现一个公正透明、可验证的抽奖功能。

核心特性

[ul]
  li]公正性保证:使用 @[Cloudflare drand 分布式随机信标,信标只有在开奖时间到达后才能获取[/li]
  [li]可验证:任何人都可以通过 drand API 验证抽奖结果[/li]
  [li]纯前端算法:抽奖算法在浏览器端执行,后端仅提供评论数据[/li]
  [li]灵活配置:支持自定义开奖时间、中奖人数、起始楼层、排除重复用户等[/li]
[/ul]

效果预览

功能分为两个模式:
[ul]
  [li]编辑模式:输入帖子 ID → 设置抽奖参数 → 生成抽奖链接[/li]
  [li]查看模式:显示配置 → 倒计时 → 自动开奖 → 展示中奖名单[/li]
[/ul]




实现原理

[ul]
  [li]drand 随机信标[/li]
[/ul]

@drand 是由 Cloudflare、Protocol Labs 等组织共同维护的分布式随机数生成网络。它的特点是:

[ul]
  [li]不可预测:在指定时间之前,无人能获取该时间的随机数[/li]
  [li]不可篡改:随机数由多个节点共同生成,任何单一节点无法操控[/li]
  [li]可验证:任何人都可以验证随机数的真实性[/li]
[/ul]

我们使用 drand 的
  1. quicknet
复制代码
链,每 3 秒产生一个新的随机信标。

[ul]
  [li]抽奖算法[/li]
[/ul]

[ul]
  [li]确定性随机数生成器 (PRNG)[/li]
[/ul]

使用 xorshift128+ 算法,确保相同的种子产生完全相同的随机序列:




文件结构




后端实现

[ul]
  [li]数据查询函数 (model/bitsfloodlucky.func.php)[/li]
[/ul]

[ul]
  [li]加载 model (hook/modelincfile.php)[/li]
[/ul]

[ul]
  [li]添加路由 (hook/indexroutecaseend.php)[/li]
[/ul]

注意:Xiuno 的
  1. message()
复制代码
函数在某些情况下会输出 HTML 而非 JSON,所以这里直接使用
  1. echo json_encode()
复制代码
+
  1. 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 |




安装步骤

[ul]
  [li]创建文件[/li]
  [ul]
    [li]将
  1. bitsflood_lucky.func.php
复制代码
放入
  1. plugin/your_theme/model/
复制代码
[/li]
    [li]将
  1. lucky.js
复制代码
放入
  1. plugin/your_theme/view/js/
复制代码
[/li]
    [li]创建
  1. lucky.htm
复制代码
页面模板[/li]

  [li]修改 hook 文件[/li]
  [ul]
    [li]在
  1. model_inc_file.php
复制代码
中 include model 文件[/li]
    [li]在
  1. index_route_case_end.php
复制代码
中添加路由[/li]

  [li]清空缓存
[/li]

  [li]测试[/li]
  [ul]
    [li]访问
  1. http://your-site.com/lucky.htm
复制代码
[/li]
    [li]输入帖子 ID,点击预览[/li]
    [li]设置参数,生成抽奖链接[/li]
[/ul]




验证抽奖结果

用户可以通过以下方式验证抽奖公正性:

[ul]
  [li]查看 drand 信标[/li]
  [ul]
    [li]访问
  1. https://api.drand.sh/{chain_hash}/public/{round}
复制代码
[/li]
    [li]确认
  1. randomness
复制代码
值与页面显示一致[/li]

  [li]重新计算[/li]
  [ul]
    [li]使用相同的参数和 randomness[/li]
    [li]执行相同的洗牌算法[/li]
    [li]结果必须完全一致[/li]
[/ul]




常见问题

Q: 为什么 API 返回 HTML 而不是 JSON?

Xiuno 的
  1. message()
复制代码
函数在非 AJAX 环境下会输出 HTML。解决方案:

Q: URL 构造错误怎么办?

PHP 的
  1. url()
复制代码
函数会添加
  1. .htm
复制代码
后缀。在 JavaScript 中构造 API URL 时需要移除:

Q: 如何支持大量评论?

API 使用分页加载(每次 100 条),前端会自动递归获取所有页面的数据。




总结

本文介绍了如何在 Xiuno BBS 中实现一个基于 drand 随机信标的公正抽奖功能。核心要点:

[ul]
  [li]后端:提供评论数据 API,使用
  1. echo json_encode()
复制代码
输出[/li]
  [li]前端:通过 drand 获取随机信标,使用 xorshift128+ 和 Fisher-Yates 实现确定性洗牌[/li]
  [li]可验证:用户可通过 drand API 验证随机数真实性[/li]
[/ul]

希望这篇教程对你有帮助!如有问题欢迎交流讨论。




相关链接:
[ul]
  li]@[drand 官网[/li]
  li]@[drand API 文档[/li]
  li]@[Bitsflood论坛[/li]
[/ul]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2026-1-3 02:57 , Processed in 0.174128 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表