第三章:基于zkSNARK的战舰游戏

战舰是两个玩家的战略猜谜游戏。该游戏在一个 10X10 的网格中进行,每个玩家在网格中标记自己的战舰舰队。舰队的位置对其他玩家隐藏。玩家交替轮流向对方的战舰发出“射击”,游戏的目标是摧毁对方玩家的舰队。

链上悖论

在离线环境中,两名玩家面对面坐着,他们看不到对方的舰队。但是当在智能合约中玩链上游戏时,似乎存在一个悖论。

一方面,我们希望游戏状态转换遵循游戏规则,没有玩家可以作弊。例如,玩家在放置后无法移动他的舰队来躲避命中。区块链是理想的选择,因为其上的数据和计算都是可公开验证和审计的。另一方面,我们需要对每个用户保密部分状态。但区块链本质上是开放和透明的。

zkSNARK 来救援

我们使用 zkSNARK 来解决这个问题。每个玩家首先通过散列他的舰队位置并在链上提交这个哈希承诺。使用 zkSNARK,玩家可以提交一个证明来证明对方的标记,是否击中船舰,而无需披露舰队位置。对手可以在进一步移动之前验证证明是否有效。因此,我们可以从中制作一个公平的链上战舰游戏。

请注意,这与我们之前在智能合约中经常使用的显性-承诺方案有很大不同,位置信息在整个游戏过程中对其所有者保密并且从未透露。