# 通过ZKP对PopCraft游戏性能优化的探索

By [Yooma](https://paragraph.com/@yooma) · 2024-10-10

---

问题背景
----

在 PopCraft 游戏中，每一步操作都需要上链，这导致交互时间较长，用户体验较差。

理想情况或目标：
--------

通过在 Solidity 合约中使用零知识证明 (ZKP) 加速游戏性能。具体目标是确保游戏的过程不上链，但同时防止作弊。玩家的每一步操作会生成 ZKP 证明，最后将结果证明发送到智能合约进行验证。

### 研究过程、思路与挑战：

*   \*\*游戏过程与结果的防作弊：\*\*仅对游戏结果生成 ZKP 证明是不够的，因为游戏的过程同样存在作弊的可能性。因此，既要对结果生成证明，也需要对游戏过程进行验证。
    
*   \*\*逐步生成证明的技术挑战：\*\*为了防止作弊，希望可以在游戏的每一步操作后生成一个 ZKP 证明，最终在游戏结束时将最后一个证明上链进行验证。这个过程中，每一步的证明都会依赖于前一步的证明，直到游戏结束为止。但难题是：
    
    *   每次生成证明时需要依赖前一步的证明，这使得验证过程复杂化以及不确定能否实现，并且验证是在合约端做，第二次生成证明时又如何去验证第一步的证明是正确的。
        
    *   在智能合约端验证每个步骤的证明是否正确时，如何确保每个证明与前一个证明的连贯性，这是一个不确定的问题。
        
*   **公开游戏数据的问题：** PopCraft 的游戏数据是公开的，因此隐藏数据没有必要。如果上述验证步骤都能实现的话，下一步需要考虑在合约端保存游戏数据。然而，问题在于，ZKP 证明的性质无法解出具体的游戏数据，此时也不可直接相信前端传到合约的游戏结果数据，这意味着合约无法直接存储这些数据。
    
*   **Token 销毁问题：** 当游戏涉及到 Token 的消耗时，例如使用Token消除物质时，要销毁对应的Token，如何处理这一步ZKP 生成和验证又是一个问题。
    
    *   一个可能的思路是，这一步继续按照之前的流程生成 ZKP，验证消耗的 Token 数量并最终发给合约。然而，由于 ZKP 证明无法获取具体数据，合约端无法判断应销毁的 Token 数量。此外，假设玩家拥有 3 个 Token A，却尝试在游戏中消耗 4 个，这种错误可能会在游戏结束时才被发现，而不是在用户操作的最初阶段就得到提示。
        
    *   另一个可能是，在使用Token消除时，这一步直接与合约交互去销毁，然后更新Token余额，生成的证明只负责保存此时游戏操作和状态的证明。那么此时在销毁成功之后这一步还需要像前面操作一样继续生成证明，如果不生成，那么在销毁Token操作的上一步生成的证明与下一次生成的中间多了一次与合约直接交互销毁的步骤，那么证明中的游戏的状态就会冲突，这样到最后证明是否还会有效也是个疑点。
        
*   **ZKP 的数据隐藏问题：** PopCraft 这种公开游戏数据的场景来说，数据的隐藏，这一步是多余的，并且增加了数据获取的难度以及实现的不确定性。PopCraft只需要确保游戏过程和结果无作弊，并不需要隐匿具体数据。
    

结论
--

在 PopCraft 这样的游戏中，数据是公开的，因此隐藏信息并不必要。为了优化游戏的用户体验，提升响应速度，可以考虑将游戏过程不上链，仅将最终结果上链。关键在于找到一种方法，确保从游戏的第一步到最后一步都没有作弊可能，最后将正确的结果上链验证即可，如果进行了隐藏反倒是增加了更多的难度。其次就是确保游戏过程不作弊，使用ZKP能确保单个的操作得到证明，但是为了加速又不会生成一段证明就提交一次交易，所以从游戏第一步到结束整个过程又如何保证。

---

*Originally published on [Yooma](https://paragraph.com/@yooma/zkp-popcraft)*
