Cozy Reef如何使用多个Chainlink服务来支持其高级游戏应用

Chainlink服务能帮助去中心化游戏生态避开区块链游戏会面临的一些常见陷阱,并为玩家创造更深入、更有价值的体验。Cozy Reef Labs在Chainlink 2021黑客松的项目中将多个Chainlink服务集成到他们的第一款游戏Slingshot Sailers,其中包含使用Chainlink Automation进行去中心化游戏状态管理,使用Chainlink VRF作为可证明的随机性,以及使用Chainlink外部适配器完成在不同的区块链上的结算层和游戏逻辑层。在本文中,我们将深入了解Cozy Reef的幕后故事,并了解他们的团队如何利用这些不同的Chainlink服务来构建高级游戏dApp。

Cozy Reef Labs

欢迎来到Cozy Reef

Welcome to Cozy Reef

Cozy Reef Labs的成立是为了利用区块链技术的独特功能创造基于社区的深度游戏体验。

团队中的每个成员都在视频游戏行业拥有丰富的工作经验,并希望将有趣、有意义的玩家体验放在首位。 为了做好这件事,团队设定了一个雄心勃勃的目标:构建一个玩家可以留存的游戏生态系统,而不只是构建一个游戏。这些游戏易于学习但难以掌握,是玩家能够探索和体验的更大世界,并且在具有竞争力的同时能为玩家提供奖励。

我们了解到Chainlink技术可以帮助我们实现这些目标甚至更多。我们将能够建立完全在链上的游戏,为玩家提供前所未有的透明度,同时秉持玩游戏赚收益的精神培养出一个有竞争力的游戏环境。通过将公链与Chainlink服务的生态系统相结合,我们能够建立一个将重点放在游戏体验上的去中心化的平台。

Cozy Reef将以一系列淘汰赛的形式推出,幸存者被邀请作为Cozy Reef“杀手”参与平台的未来方向决策。每场游戏以后都可以在更广泛的生态系统中重现,玩家可以在那里游戏、竞争并获得奖励。

Chainlink Automation驱动核心游戏循环

Slingshot Sailors

Slingshot SailorsCozy Reef第一季的第一场淘汰赛。玩家必须从五个具有不同属性的弹弓中挑选一个,将自己从追击的Cozy Reef杀手那里发射出去。弹弓上的玩家越多,其距离奖励和发射机会就越高。但弹弓中的玩家数量也会增加其发射错误的机会,从而导致距离惩罚。为了在整个游戏中成功地躲避Cozy Reef杀手,玩家必须平衡风险和回报,并在每个回合中对其他玩家的决定作出反应。核心游戏循环有以下几个阶段:

  • MOVEMENT | 移动–玩家能够选择跳上哪条弹弓。一个弹弓上的玩家数量会改变弹弓发射成功或发射失败的几率,并影响距离乘数。
  • LOCKOUT | 锁定–玩家不再能够选择弹弓。这段时间是为了达到一定的区块确认完成区块链的最终一致性,从而防止对预言机VRF调用的抢跑以及区块的重组等问题。
  • VRF_REQUESTED | VRF请求–向Chainlink VRF请求一个随机数,这决定了每个弹弓的结果。
  • VRF_RECEIVED | VRF接收–随机数被成功处理,本轮结果被计算出来。我们创建了这个额外的状态,因为每轮计算超过了VRF调用中允许的最大gas数量(200,000gas)。注意:开发者可以在向Automation注册他们的dApp时配置最大gas。

Slingshot Sailors screenshot 2

在基于时间的环境中,单靠智能合约还不足以充当游戏运行器,因为它需要一个外部调用来促使阶段的转换。Chainlink Automation允许我们以去中心化的方式检查和触发阶段转换。我们通过连接`checkUpKeep`函数来检查是否需要将游戏转移到下一个阶段,这主要是由`block.timestamp`驱动的。

function checkUpkeep(bytes calldata) external view override returns (bool, bytes memory) {
    bytes memory empty;
    return (canTick(), empty);
  }

function canTick() public view returns (bool) {
    return
      state.game.phase != Phase.NONE &&
      state.game.phase != Phase.END &&
      block.timestamp >= state.game.phaseScheduledEnd;
  }

当 “checkUpKeep “函数返回 “true”时,Automation就会调用 “performUpKeep “来将游戏过渡到下一个阶段。

function performUpkeep(bytes calldata) external override {
    tickState(false);
  }

function tickState(bool force) public {
    if (!(force || canTick())) return;

    if (state.game.phase == Phase.LOCKOUT) {
      require(LINK.balanceOf(address(this)) >= vrfState.fee, "Not enough LINK");
      requestRandomness(vrfState.keyHash, vrfState.fee);
    }

    if (state.game.phase == Phase.VRF_RECEIVED) {
      sweepLanes(state.game.random);
      state.game.sweep++;
      state.game.lastRandom = state.game.random;
    }

    Phase previous = state.game.phase;
    state.gotoNextState();
    emit StateUpdated(previous, state.game.phase);
    return;
  }

在`tickState`函数中,会根据游戏阶段触发不同的动作。例如,如果该阶段目前处于LOCKOUT阶段,就会发出一个VRF请求,状态将变为VRF_REQUESTED。合约会发出 “StateUpdated “事件,玩家的浏览器会根据更新的合约状态调用视图函数来响应。为了节约gas和成本,游戏合约只存储原始的游戏事件(弹弓发射,玩家的移动历史,等等)。运行游戏的浏览器从游戏合约中获取这些事件,并计算玩家在屏幕上看到的游戏状态(这个过程在白皮书中有更全面的描述)。 Slingshot Sailors 的完整游戏合约将在游戏的第一个实例启动后不久开源。我们也鼓励社区在他们自己的游戏项目中参考这个合约!

Chainlink VRF实现了玩家的互动

Cozy Reef Chainlink Keepers and VRF diagram

玩家必须围绕风险管理做出决定,挑选他们认为有最佳回报(发射机会、距离倍数)与风险(发射失败机会、距离惩罚)的弹弓。根据概率和其他玩家的行为做出决定是Slingshot Sailors的核心兴奋点。Chainlink VRF允许我们以去中心化的方式生成可证明的随机数,以驱动每一轮的独特结果。通过一个VRF调用,我们能够决定五个弹弓中的每一个是发射、发射失败还是什么都不做。

如上节所述,当游戏阶段从`LOCKOUT`过渡到`VRF_REQUEST`时,`requestRandomness`函数被调用,传入keyHash值和费用。VRF将通过`fulfillRandomness`回调生成并传回一个随机数,如下图所示。

function fulfillRandomness(bytes32, uint256 randomness) internal override {
    state.game.random = randomness;
    state.gotoNextPhase();
  }

function gotoNextPhase(State storage self) public {
    …
    } else if (self.game.phase == Phase.VRF_REQUESTED) {
      self.game.phase = Phase.VRF_RECEIVED;
      self.game.phaseScheduledEnd = uint48(block.timestamp);
    }
    …
    self.game.phaseStart = uint48(block.timestamp);
  }

function tickState(bool force) public {
    …
    if (state.game.phase == Phase.VRF_RECEIVED) {
      sweepLanes(state.game.random);
      state.game.sweep++;
      state.game.lastRandom = state.game.random;
    }

    Phase previous = state.game.phase;
    state.gotoNextState();
    emit StateUpdated(previous, state.game.phase);
    return;
  }

回调函数会设置随机数,并触发下一个阶段的变化,由Chainlink Automation更新,最终调用 “tickState “函数,并通过 “sweepLanes “确定该回合结果。

Chainlink外部适配器实现了多链生态系统

Cozy Reef Chainlink External Adapters diagram

我们在开发Cozy Reef时,将可访问性作为我们的核心原则之一。玩家不应该为玩我们的链上游戏而支付高昂的费用。通过一些初步的成本分析(参考我们的白皮书),我们估计在Polygon这样的侧链上玩SlingShot Sailors比在Ethereum主网上玩要便宜7500倍以上。然而,我们认识到,Ethereum主网仍然是处理结算的理想区块链。

我们的解决方案是在以太坊主网上铸造创世NFT,并在Polygon上运行游戏。为了验证所有权并允许玩家进入游戏,我们利用视图函数外部适配器建立了一个储备证明服务。在以太坊主网上拥有Cozy Reef NFT的玩家调用Polygon上的验证器,验证代币的所有权并允许玩家进入游戏实例。采取这种方法可以实现多链功能,同时将玩家体验放在首位。

  • 所有的合约调用都是在侧链上进行的,这比玩家不得不在以太坊主网上通过合约调用进行桥接要便宜得多。
  • 临时游戏实例和对每个游戏实例的验证消除了跨链所有权不同步的主要挑战。
  • 使用储备证明模型,而不是NFT桥,消除了由托管账户管理NFT的安全风险。
  • 侧链代币的成本很低,Cozy Reef Labs可以持续地使用收入来空投代币给玩家,以抵消成本和抽象代币桥接复杂性。

NFT储备证明的原型以及技术分解可在GitHub上找到。未来的发展将包括通过用Chainlink DON为协议提供动力来进一步分散这个组件。

未来开发规划

我们在Cozy Reef的第一个主要里程碑是交付了链上淘汰赛的第一季,并邀请幸存者加入Cozy Reef“杀手”。随着Cozy Reef成长为一个更广泛的游戏平台,我们将需要建立更多的基础设施。我们很高兴能继续利用Chainlink Automation的能力,使整个生态系统完全去中心化。

游戏调度–Slingshot Sailors将在每个游戏周期中以固定的开始和结束时间为基础运行。我们打算在循环的基础上重新运行这个游戏和未来的游戏,让玩家继续竞争并获得奖励。Chainlink Automation是一个很好的候选者,可以以可预测和可靠的方式调度游戏。

游戏后处理工作-玩家将根据他们在每个游戏中的表现获得代币。Chainlink Automation是一个很好的候选者,可以可扩展地去中心化的方式管理游戏后的处理,如奖励分配。

奖学金和质押管理–我们希望为Cozy Reef所有者创造机会,将他们的代币质押,并参与链上支持的奖学金计划。Chainlink Automation解锁了我们建立综合系统来管理这些项目和分配奖励的能力。

Cozy Reef artwork

随着Cozy Reef第一季的推出,该团队希望能拓展区块链游戏领域的可能性。Chainlink技术使我们能够以一种透明的、有吸引力的、更广泛的游戏社区可以接触到的方式,将体验完全带到链上。

了解更多

如果你是一个开发者,并希望将你的智能合约连接到底层区块链以外的现有数据和基础设施,请在这里联系或访问开发者文档

Need Integration Support?
Talk to an expert
Faucets
Get testnet tokens
Read the Docs
Technical documentation