ZooBC 维基
应用与在 ZooBC 上开发

多人应用

ZooBC 上的棋盘游戏和骰子游戏由两到四人进行,每一步走子都是一笔交易,每个节点都按相同的规则检查它。赌注构成奖池,游戏结束时由协议付出,除非游戏以平局结束,否则要扣除归入应用池的 1% 抽成。

开局与加入

一名玩家用 CreateApp 开设一局游戏,选择类型和 2 到 4 个席位(海战棋总是恰好 2 个),并支付第一份赌注。这局游戏的状态为 Open。每笔 JoinApp 支付一份相等的赌注,最后一个席位被填满时,游戏变为 Active。可以选择指定一名对手,把这局游戏变成一次直接挑战,只有该账户可以加入。

一个席位需要一个 36 字节的账户,例如原生 ZooBC 账户。地址为 24 字节的账户,即以太坊类型和比特币哈希类型,不能入座,尽管错误消息写的是“multiplayer apps require a ZBC account”(密钥与账户类型)。单人投注接受任何账户。

谁先走

谁先走可能很重要,因此没有人能提前知道或操纵它。最后一个席位被填满时,回合处于待定状态:没有人处于计时中,任何走子都是空操作。两个区块之后,结算器抽出先手席位:对那个区块的种子和应用的 id 取哈希,再对席位数取模。包含最后一笔加入交易的区块的出块者知道自己的种子,却不知道两个区块之后的种子,因此它无法根据谁会先走来决定收录还是排除这笔加入交易。创建者和最后加入者都不会按规则自动先走。海战棋是例外:加入者先行动,即提交自己的棋盘承诺。

在四种骰子游戏(飞行棋、猪骰子、赛跑和简化版大富翁)中,走子不会在收录它的区块中被应用。它先作为待定走子保存,由下一个区块应用,使用该区块的种子,并以该走子的交易 id 作为键,因此收录该走子的出块者永远看不到掷骰结果。同一时间只允许一个待定走子,在此期间变得非法的走子会被丢弃。

走子计时

最后一个席位加入时,以及之后每一步被接受的走子之后,截止期限都被设为 240 个区块之后,约一小时。轮到走子的玩家必须在此之前走子,或者发送一笔走子内容为空的 AppMove:这是一种付费的保活操作,把截止期限再往后推 240 个区块。不处于计时中的玩家发出的走子,或非法走子,在提交时会被拒绝;如果它仍然进入了区块,则是一次不收手续费的空操作。

走子计时:上一步走子 240 个区块之后,等待中的玩家可以申领扣除 1% 抽成后的奖池。
走子计时:上一步走子 240 个区块之后,等待中的玩家可以申领扣除 1% 抽成后的奖池。

游戏如何结束

结局方式赔付
获胜一步走子赢得游戏奖池扣除 1% 抽成,归赢家
平局一步走子使游戏以平局结束每个席位取回自己的赌注;不收抽成
认输一名玩家发送 ResignApp奖池扣除抽成,由其他席位平分,余数归其中第一个席位
超时一名不处于计时中的已入座玩家从截止期限 + 1 起发送 ClaimAppTimeout奖池扣除抽成,在除计时中席位以外的每个席位之间分配

抽成为 floor(奖池 × 100 ÷ 10,000),即奖池的 1%:两名玩家各押 1 ZBC,奖池为 2 ZBC,赢家在获胜走子所在的区块中收到 1.98 ZBC。出块者不从奖池中拿走任何东西。没有任何游戏会自行结束:错过截止期限之后,游戏会一直等到某名玩家选择发送申领,而任何人,包括 ZooBC Foundation,都不能取消一局游戏。

引擎

每种游戏的引擎都是节点的一部分,其中有几处值得了解的简化:

  • 国际象棋没有王车易位和吃过路兵,兵总是升变为后;
  • 西洋跳棋强制吃子,并连续进行多跳;
  • 黑白棋在某个席位没有合法走子时跳过它;
  • 点格棋中完成一个方格后可以再走一步;
  • 猪骰子先到 100 分者获胜,赛跑(即蛇梯棋)以 49 为终点;
  • 飞行棋每个席位移动四枚棋子;
  • 简化版大富翁每个席位起始资金为 1,500,每经过起点(GO)获得 200。

海战棋:公开链上的秘密

海战棋需要隐藏信息,而链上的一切都是公开的,它通过承诺—揭示来做到这一点。开局前,每名玩家为 10 × 10 棋盘的 100 个格子各选一个秘密的 32 字节盐值,并为每个格子公布 SHA3-256(is_ship ‖ salt):共 100 个哈希,总计 3,200 字节。创建者在 CreateApp 中发送自己的承诺,加入者则把自己的承诺作为第一步走子发送。由于每个盐值都是随机的,这些哈希不泄露任何信息。

玩家用走子 [0, cell] 开火。该棋盘的所有者必须用 [1, is_ship, salt] 揭示待定的格子,每个节点都检查它们的哈希是否等于承诺值。撒谎会得到不同的哈希而被拒绝,因此所有者只能说实话,否则就会超时,因 ClaimAppTimeout 而输掉。率先击中 17 个舰船格子的玩家获胜。承诺更少的舰船格子毫无好处:一旦开火方打完全部 100 发,而揭示出的舰船格子少于 17 个,开火方即获胜。

用承诺—揭示实现的海战棋:链上的哈希、一次开火,以及每个节点都会核对的揭示。
用承诺—揭示实现的海战棋:链上的哈希、一次开火,以及每个节点都会核对的揭示。

另见