单人投注
有六种游戏是独自与庄家对赌的:双骰子、抛硬币、轮盘、老虎机、彩票和 crash。一笔投注就是一笔只有一个席位的 CreateApp 交易。它的结果来自下注时尚不存在的随机性,赢了由应用池支付。
下注
投注者发送 CreateApp,其中包含游戏类型(16 到 21)、投注内容和赌注,赌注以 ZBC 或某种代币计。投注执行时,赌注转入应用池。任何账户都可以投注,包括使用以太坊式或比特币式密钥的账户,这类账户不能在多人游戏中入座(多人应用)。
末尾附加一个字节 N(1 到 100),就会用同一个种子把同一笔投注进行 N 次,赌注在各次之间平均分配。
结果何时、如何抽出
被打包进区块 N 的投注在区块 N + 2 用该区块的种子结算,大约在 30 秒之后。每个区块的种子由其出块者用可验证随机函数根据前一个种子算出(区块种子(VRF)),因此当投注正落入区块 N 时,区块 N + 2 的种子还不存在。没有人能预测结果,收录该投注的出块者也无法先看到结果。如果位于 N + 2 的区块是由投注者自己的节点产出的(比较的是所有者账户),这笔投注会等待一个由其他人产出的更靠后的区块。
抽取的结果是该种子与应用 id 的哈希,使用专属的标签:
r = LE64(first 8 bytes of SHA3-256("zbc-apps" ‖ seed ‖ LE64(app id) ‖ LE64(0)))
多次投注中的第一次使用 r;之后各次使用以 r 为种子的 splitmix64 生成器的输出。任何人都可以根据公开数据重新计算结果并核对赔付。没有需要揭示的秘密,也没有每日批量开奖:每笔投注都单独结算。
赔付表
| 游戏 | 投注 | 赢了赔付 | 庄家优势 |
|---|---|---|---|
| 抛硬币(17) | 正面或反面 | 1.98× | 1% |
| 双骰子(16) | 小于 7 或大于 7 | 2.28× | 5% |
| 幸运 7 | 5.70× | 5% | |
| 精确总点数 | 34.20 ÷ 组合数(2 或 12:34.2×) | 5% | |
| 轮盘(18) | 单个号码 | 36× | 1/37,约 2.7% |
| 红或黑 | 2× | 约 2.7% | |
| 老虎机(19) | 三个 7、其他三连、任意一对 | 50×、15×、1.8× | 约 10.7% |
| 彩票(20) | 0 到 99 中的一个号码 | 90× | 10% |
| crash(21) | 1.01× 到 10.00× 之间的目标 T | 崩盘点达到 T 时赔 T | 约 1% |
对于精确的骰子总点数,组合数是两颗骰子凑出该点数的方式数:6 − |7 − 总点数|。轮盘有 37 个格子,0 为绿色,颜色与真实的欧式轮盘一致。老虎机有三个转轮,每个转轮有八种符号,期望回报为 457.4/512。在 crash 中,目标在下注时就已固定;没有提前兑现的走子。
庄家优势内置于每张赔付表中。抛硬币时你有一半的机会赢,赢了返还赌注的 1.98 倍,因此平均而言每押 1 ZBC 会收回 0.5 × 1.98 = 0.99 ZBC,剩下的 1% 留在应用池。输了则什么都不转移,因为赌注已经在池中。
投注上限
在接受一笔投注之前,节点会计算它可能产生的最大赔付(而不是平均赔付),并与上限比较,上限为池中赌注所用资产余额的 5%:
largest payout ≤ floor(pool balance × 500 ÷ 10,000)
最大赔付对骰子而言是该投注自身的倍数,抛硬币为 1.98×,轮盘为 36×,老虎机为 50×,彩票为 90×,crash 为 T。超过上限的投注在提交时即被拒绝(“bet too large for the apps pool”),而仍然进入了区块的投注则是一次付费空操作。
有了这个上限,任何一次幸运的结果都无法掏空该池。第二项限制,即每区块额度,可以把一笔非常大的奖金分摊到多个区块支付(应用池)。