Chainlink 服務使去中心化遊戲生態系統能夠避開區塊鏈遊戲面臨的一些常見陷阱,並為玩家創造更深入、更有價值的體驗。對於他們的Chainlink Hackathon 2021 項目,Cozy Reef Labs 將多個Chainlink 服務集成到他們的第一款遊戲Slingshot Sailers 中,使用 鏈環守護者 用於分散的遊戲狀態管理, Chainlink VRF 對於可證明的隨機性,以及 Chainlink 外部適配器 利用不同的區塊鏈進行結算和遊戲層。在本技術演練中,深入了解Cozy Reef 構建的幕後故事,並了解他們的團隊如何利用這些不同的Chainlink 服務來構建高級遊戲dApp。
經過 舒適珊瑚礁實驗室
歡迎來到舒適的珊瑚礁
Cozy Reef Labs 的成立旨在利用區塊鏈技術的獨特功能創造基於社區的深度遊戲體驗。
團隊的每個成員都在視頻遊戲行業擁有豐富的工作經驗,並希望將有趣、有意義的玩家體驗放在首位。為了做好這件事,團隊設定了一個雄心勃勃的目標:我們將建立一個遊戲生態系統,而不是構建一個遊戲,玩家可以隨著時間的推移重新回到遊戲中。這些遊戲易於學習但難以掌握,適合玩家想要探索和體驗的更大世界,並且具有競爭力和獎勵玩家的時間。
我們意識到Chainlink 技術可以幫助我們實現這些目標以及更多目標。我們將能夠構建完全鏈上的遊戲,為玩家提供前所未有的透明度,同時營造一個以遊戲賺錢為理念的競爭性遊戲環境。通過將公共區塊鏈與Chainlink 服務的生態系統相結合,我們能夠構建一個去中心化的平台,將重點放在遊戲體驗上。
Cozy Reef 將推出一系列消除遊戲,邀請倖存者作為Cozy Reef Killer 參與平台的未來發展方向。每款遊戲稍後都可以在更廣泛的生態系統中重玩,玩家可以在其中玩、競爭並獲得獎勵。
Chainlink Keepers 推動核心遊戲循環
Slingshot Sailors 是Cozy Reef 第一季的第一款消除遊戲。玩家必須從五個具有不同屬性的彈弓中選擇一個,才能將自己從追逐的Cozy Reef Killers 中彈開。投石索中的玩家越多,其距離獎勵和開火機會就越高。但這並不全是陽光和大乘數- 吊索中的玩家數量也會增加其失誤的機會,從而導致距離懲罰。為了在整個遊戲中成功避開舒適礁殺手,玩家必須平衡風險和獎勵,並在每一輪中對其他玩家的決定做出反應。核心遊戲循環通過以下階段循環:
- 運動——玩家可以選擇跳上哪個吊索。投石索上的玩家數量會改變投石索發射或反擊的機率,並影響距離乘數。
- 鎖定——玩家不再能夠選擇吊索。這段時間是為了讓鏈在區塊確認上達到最終確定性,以防止VRF 調用和區塊重組的搶先運行。
- VRF_REQUESTED——向Chainlink VRF 發出一個隨機數請求,該隨機數決定了每個sling 的結果。
- VRF_RECEIVED – 隨機數已成功處理併計算出回合結束。我們創建了這個額外的狀態,因為輪計算超過了VRF 調用中允許的最大氣體 (200,000 氣體)。注意:開發者可以在將他們的dApp 註冊到Keepers 時配置最大gas。
僅智能合約不足以在基於時間的環境中充當遊戲運行者,因為它需要外部調用來促進相變。 Chainlink Keepers 允許我們以去中心化的方式檢查和触發相變。我們通過連接`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 時,Keepers 會調用`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”事件,玩家的瀏覽器會根據更新後的合約狀態調用視圖函數來響應。為了節省燃料和成本,遊戲合約僅存儲原始遊戲事件(彈弓發射、玩家移動歷史等)。運行遊戲的瀏覽器然後從遊戲合約中獲取這些事件並懶惰地計算玩家在他們的屏幕上看到的遊戲狀態(這個過程在 白皮書.) Slingshot Sailors 的完整遊戲合約將在遊戲第一個實例發布後不久開源。我們鼓勵社區在他們自己的遊戲項目中參考這份合同!
Chainlink VRF 支持動態玩家互動
玩家必須圍繞風險管理做出決定,並選擇他們認為具有最佳回報(射擊機會、距離乘數)與風險(適得其反的機會、距離懲罰)的彈弓。基於概率和其他玩家的行為方式做出決定是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 Keeper 更新,最終調用`tickState` 函數並通過`sweepLanes` 解決回合。
Chainlink 外部適配器啟用多鏈生態系統
我們正在開發Cozy Reef,將可訪問性作為我們的核心原則之一:玩家不應該支付高昂的價格來玩我們的鏈上游戲。通過一些初始成本分析(參考我們的 白皮書),我們估計在Polygon 等側鏈上玩SlingShot Sailors 比在以太坊主網上便宜7500 倍。然而,我們認識到以太坊主網仍然是理想的結算區塊鏈。
我們的解決方案是在以太坊主網上鑄造創世NFT,並在Polygon 上運行遊戲。為了驗證所有權並允許玩家參與遊戲,我們建立了一個儲備服務證明,利用 View-Function 外部適配器. 在以太坊主網上擁有Cozy Reef NFT 的玩家調用Polygon 上的驗證器,驗證代幣所有權並允許玩家進入遊戲實例。採用這種方法可以實現多鏈功能,同時將玩家體驗放在首位:
- 所有合約調用都在側鏈上進行,這比玩家必須通過以太坊主網上的合約調用橋接要便宜得多。
- 臨時遊戲實例和每個遊戲實例的驗證消除了跨鏈所有權不同步的主要挑戰。
- 使用儲備證明模型而不是NFT 橋可以消除由託管賬戶管理NFT 的安全風險。
- 側鏈代幣的成本足夠低,Cozy Reef Labs 可以可持續地利用收入向玩家空投代幣,以抵消成本並抽象代幣橋接的複雜性。
NFT 儲備證明的原型以及技術故障可在 GitHub. 未來的發展將包括通過使用Chainlink DON 為協議提供動力來進一步分散該組件。
未來發展
Cozy Reef 的第一個重要里程碑是推出第一季鏈上消除遊戲,並邀請倖存者加入Cozy Reef Killers。隨著Cozy Reef 成長為更廣泛的遊戲平台,我們將需要構建額外的基礎設施。我們很高興能夠繼續利用Chainlink Keepers 的能力來完全去中心化整個生態系統。
比賽安排— Slingshot Sailors 將在每個實例的基礎上運行,並為每個遊戲週期設定開始和結束時間。我們打算定期重播這款遊戲和未來的遊戲,讓玩家繼續競爭並獲得獎勵。 Chainlink Keepers 是以可預測和可靠的方式分散遊戲調度的絕佳候選者。
賽后處理—玩家將根據他們在每場比賽中的表現獲得代幣。 Chainlink Keepers 是可擴展地分散和管理遊戲後處理(例如獎勵分配)的絕佳候選者。
獎學金和質押管理——我們希望為Cozy Reef 所有者創造機會,讓他們質押他們的代幣並參與鏈上支持的獎學金計劃。 Chainlink Keepers 釋放了我們構建綜合系統來管理這些程序和分配獎勵的能力。
隨著Cozy Reef 第一季即將推出,該團隊希望擴大區塊鏈遊戲領域的可能性。 Chainlink 技術使我們能夠以透明、引人入勝且可供更廣泛的遊戲社區訪問的方式將體驗完全上鍊。