/**
* 核心开奖函数
* 逻辑:公平抽取 1+2+3 = 6 名中奖者
* 特性:彻底洗牌,消除入场顺序影响
*/
public function executeDraw($roundId, $blockHash) {
// 1. 奖池初始化
// 将数据库里的注单展开,例如用户买1000注,数组里就有1000个他的地址
$pool = [];
foreach ($bets as $bet) {
for ($i=0; $i < $bet['tickets']; $i++) {
$pool[] = $bet['sender'];
}
}
// 2. 引入链上随机因子 (BlockHash)
// 这是“天意”,没人能预测未来的区块哈希
$seed = crc32($blockHash . $roundId);
mt_srand($seed);
// 3. 【关键步骤】彻底洗牌 (Shuffle)
// 无论用户是连续购买还是分开购买,这一步会将所有注码彻底打散。
// 哪怕你买了1000注,洗牌后也会均匀分布在池子的各个角落。
shuffle($pool);
// 4. 依次抽取幸运儿 (抽中后移除,防止单注重复)
// [一等奖] 1名 (独享 90%)
$winner1 = $pool[mt_rand(0, count($pool)-1)];
// (逻辑处理:从池中移除已中奖的注码...)
// [二等奖] 2名 (每人 3%)
for($i=0; $i<2; $i++) {
$winner = $pool[mt_rand(0, count($pool)-1)];
// ...
}
// [三等奖] 3名 (每人 1%)
for($i=0; $i<3; $i++) {
$winner = $pool[mt_rand(0, count($pool)-1)];
// ...
}
// 5. 资金自动分配
// 90% + (3% x 2) + (1% x 3) + 1%(平台费) = 100%
}