> For the complete documentation index, see [llms.txt](https://docs.aolotto.com/cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aolotto.com/cn/kai-jiang-jiang-jin.md).

# 开奖 & 奖金

## 开奖时间

\
Aolotto没有固定的开奖时间，通常来讲，每一笔投注将会延长开奖时间到下注时间后的24小时，如果后面无新的投注追加，开奖时间则为这一笔投注时间后的24小时，例如玩家A的下注时间为2024年8月10日11:00， 开奖时间则暂定为2024年8月11日11:00，但是如果在A之后玩家B在2024年8月10日12:00追加了新的投注，那么开奖时间则更新为2024年8月11日12:00；<br>

## 投注目标

\
类似的开奖机制并非Aolotto原创，此前火爆一时的Fomo3D创造了这一机制，但Fomo3D最大的问题是游戏会无休止的持续，在不断有新的玩家追加投注的情况下，赢家将永远不会产生。Aolotto为了防止着一种情况，改进了这一机制，我们在每一轮抽奖启动的时候，为本轮设置了一个结束延时的投注量目标，当本轮投注总量到达预设值，新的投注将不会持续延长开奖时间。例如第一轮预设的投注目标为$1000, 玩家C在2024年9月1日11:00追加投注后，第一轮累计投注量刚好达到1000，那么开奖时间将会锁定为玩家C投注后的24小时，则2024年9月2日11:00， 后面无论有多少新的投注追加，都不回延长开奖时间。\
\
投注目标值不是固定的，最小值（第一轮）为$1000， 随着轮次的推进，投注目标值会逐渐增长

$$
投注目标=math.max(前一轮投注目标，1000+前一轮大奖\*0.5)
$$

这种机制建立在用户量会不断增长的预期上，更好的促进Aolotto奖池不断增长，确保游戏可持续性。<br>

## 轮次切换

Aolotto协议每1分钟检查一下轮次的开奖时间，开奖时间一旦到达，游戏将会立即快照本轮所有参与者的投注信息，并立即启动下一轮。用户在临近开奖时间时候参与投注，有可能会出现投注信息保存到次轮的情况。开奖，生成幸运号码，确认中奖者发生在轮次被切换后之后。

## 幸运号码

\
幸运号码是一个随机的3位数（000-999），基于Issac Cipher的随机数函数生成，使用开奖区块的Hash值, 轮次归档摘要(Hash Digits)以及开奖时间戳等无法提前预知的因子作为随机函数的种子输入，保证幸运号码生成具有随机性，可验证性和不可预测性：

1. 不可预测性：Arweave的区块Hash是基于区块全部交易内容生成的唯一性ID，由于开奖发生在用户参与投注之后，用户投注时并不能预测区块中的交易内容，无无法预测精准的开奖时间和通过CU签名的交易ID。
2. 可验证性：issac cipher的随机数函数在种子确定的情况下生成的结果也是确定的，意味着通过CU节点生成的幸运号码可被验证，规避CU（计算单元）节点在执行中进行黑箱操作的可能性；
3. 取值分布的随机性：3位数号码并非一次性生成，而是逐位调用随机函数，将统一的种子和位置编号作为输入，分别生成0-9之间的随机数值，保证了3位数号码取值分布的随机性；

```lua
--[[
  开奖算法的种子由如下信息链接在一起的字符串：
  block.hash: 开奖区块的Hash值；
  archive_id: 触发轮次归档时的消息ID
  archived_id: 归档完成后发送的的消息ID
  latest_bet.id：最后一笔投注的交易ID
  tostring(os.time()): 开奖时的毫秒级时间戳
]]--
local seed = block.hash ..'_'..archive_id..'_'..archived_id.."_"..latest_bet.id.."_"..tostring(os.time())

--[[
  开奖随机算法依次计算不同位置的数值，取值范围是0-9，不同位置的数值在相同种子基础上叠加了位置编号以及前一位数的结果。
]]--
local getLuckyNumber = function(seed,len)
  local numbers = ""
  for i = 1, len or 3 do
    local n = crypto.cipher.issac.random(0, 9, tostring(i)..seed..numbers)
    numbers = numbers .. n
  end
  return numbers
end

local luckyNumber = getLuckyNumber(seed,3)

```

## 中奖者 <a href="#jiang-jin-fen-fa" id="jiang-jin-fen-fa"></a>

幸运号码生成后，只有3位数完全匹配的投注可以获奖，投注匹配的参与者为中奖者，若本轮没有投注与幸运号码匹配，最后参与投注的参与者为本轮唯一的中奖者

## 奖金及分发 <a href="#jiang-jin-fen-fa" id="jiang-jin-fen-fa"></a>

每一轮奖池余额的50%将作为本轮次的大奖，轮次结束后，剩余的50%转入下一轮作为下一轮的基础奖金，所以实发奖金是奖池总额的50%

$$
大奖=（基础奖金+投注总量）\*0.5
$$

1. **该轮次有号码匹配的投注者，按照号码匹配的投注量均分大奖，**&#x4F8B;如幸运号码为002，大奖金额为$9000,玩家A匹配的投注量为2, 玩家B匹配的投注量为1，那么A获得的奖金为$6000, B获得的奖金为3000.
2. **该轮次没有匹配投注，最后玩家为唯一的中奖者，例**如大奖金额为$9000, 玩家C作为最后的下注者，将会获得$9000

这样的规则的确更有利于最后参与的玩家，通常情况下，最后的下注者中奖的概率要比之前的参与者高出50%， 但这并不代表对前面的玩家不友好，Aolotto的协议具有分红属性的原生代币的发行和投注紧密相关，我们推出了创新的Bet2Mint机制，在轮次的早期下注，通过Bet2Mint获得的$ALT会比后期下注的用户更多，$ALT的分红属性将会为您带来长期的分红受益和社区特权，公平性始终贯彻在Aolotto的协议设计中。[了解更多Bet2Mint](/cn/usdalt.md#bet2mint)
