Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
集成与开发阅读约 12 分钟

Chainlink 游戏创意:使用可验证预言机构建链上游戏

一份技术指南,介绍如何设计使用 Chainlink 预言机实现随机数、价格喂价和跨链数据的区块链游戏,包含实现模式和测试方法。

TL;DR

Chainlink 游戏创意通常围绕可验证随机数(VRF)、现实世界价格数据(价格喂价)和跨链消息传递(CCIP)展开。本文解释了如何设计使用这些预言机服务的游戏,提供了一个简单抽奖游戏和价格预测游戏的可运行代码,并概述了测试和测量流程。文章还涵盖了常见陷阱、权衡以及部署到测试网和主网的后续步骤。重点在于可复现的模式,而非具体的游戏概念。

范围与假设

本文面向希望使用 Chainlink 预言机服务构建链上游戏的开发者。假设读者熟悉 Solidity、Hardhat 或 Foundry 等开发环境,并具备 EVM 网络的基础知识。所示模式与任何支持 Chainlink 的 EVM 链兼容,但请务必在支持的网络页面上验证服务可用性。

我们聚焦于三个核心 Chainlink 服务:可验证随机函数(VRF)用于可证明公平的随机数,价格喂价用于外部市场数据,跨链互操作协议(CCIP)用于多链游戏状态。目标是提供思维模型和实现工作流,而非推荐特定游戏类型。

  • Solidity ^0.8.0 及兼容 Chainlink 的网络
  • 一个已注资的测试网账户,用于部署和支付预言机费用
  • 目标链的 RPC 端点访问权限(参见 RPC 端点指南)

使用 VRF 设计随机数驱动的游戏

一种常见模式是抽奖或彩票,随机选择获胜者。合约向 VRF 请求随机数,一旦完成,便使用该数字选择获胜者。关键在于确保请求已注资,并且回调得到安全处理。

以下是一个使用 Chainlink VRF v2 的最小 Solidity 合约。假设您已设置订阅并添加了消费者合约。请将占位符替换为实际值。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol";
import "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol";

contract RandomLottery is VRFConsumerBaseV2 {
    VRFCoordinatorV2Interface COORDINATOR;
    uint64 subscriptionId;
    bytes32 keyHash;
    uint32 callbackGasLimit = 100000;
    uint16 requestConfirmations = 3;
    uint32 numWords = 1;
    uint256 public randomResult;
    address public recentWinner;
    address[] public players;

    constructor(
        address _vrfCoordinator,
        uint64 _subscriptionId,
        bytes32 _keyHash
    ) VRFConsumerBaseV2(_vrfCoordinator) {
        COORDINATOR = VRFCoordinatorV2Interface(_vrfCoordinator);
        subscriptionId = _subscriptionId;
        keyHash = _keyHash;
    }

    function enter() public {
        players.push(msg.sender);
    }

    function pickWinner() public returns (uint256 requestId) {
        requestId = COORDINATOR.requestRandomWords(
            keyHash,
            subscriptionId,
            requestConfirmations,
            callbackGasLimit,
            numWords
        );
    }

    function fulfillRandomWords(uint256, uint256[] memory randomWords) internal override {
        randomResult = randomWords[0];
        uint256 index = randomResult % players.length;
        recentWinner = players[index];
        players = new address[](0);
    }
}

为预测游戏集成价格喂价

价格预测游戏让玩家猜测资产会上涨还是下跌。为了结算投注,合约从 Chainlink 价格喂价读取最新价格。喂价地址因网络和资产而异;您可以在 Chainlink 文档或通过 Chainlink 数据喂价页面找到它们。

下面的示例展示了一个简单合约,它存储猜测并在之后根据当前价格进行检查。它使用了 AggregatorV3Interface。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract PricePrediction {
    AggregatorV3Interface internal priceFeed;
    uint256 public startPrice;
    bool public betUp;
    address public player;

    constructor(address _priceFeed) {
        priceFeed = AggregatorV3Interface(_priceFeed);
    }

    function placeBet(bool _up) external {
        require(player == address(0), "Bet already placed");
        player = msg.sender;
        betUp = _up;
        startPrice = getLatestPrice();
    }

    function settle() external returns (bool won) {
        require(player != address(0), "No bet");
        uint256 endPrice = getLatestPrice();
        won = (betUp && endPrice > startPrice) || (!betUp && endPrice < startPrice);
        // payout logic here
        player = address(0);
    }

    function getLatestPrice() public view returns (uint256) {
        (, int256 price,,,) = priceFeed.latestRoundData();
        return uint256(price);
    }
}

使用 CCIP 实现跨链游戏状态

如果您的游戏跨越多个链,CCIP 可以中继消息和代币。例如,链 A 上的玩家可以赚取在链 B 上铸造的奖励。CCIP 需要路由器地址和费用代币。实现涉及使用消息负载调用路由器的 ccipSend 函数。

由于 CCIP 更为复杂,请从测试网开始并使用 CCIP 测试工具。Chainlink CCIP 文档提供了详细指南。对于多链的 RPC 访问,考虑使用多链 RPC 提供商;参见多链 RPC 端点指南。

测试与测量流程

在部署之前,在测试网上测试您的游戏逻辑。使用目标链的本地分叉来模拟预言机响应。对于 VRF,您可以模拟协调器。对于价格喂价,使用模拟聚合器。测量每次预言机交互的 gas 成本和延迟。

创建一个结果表来记录关键指标。每个测试至少运行三次并记录平均值。下面是一个模板;填写您自己测量的值。

  • 测试 1:VRF 请求和完成的 gas 成本
  • 测试 2:价格喂价读取的 gas 成本
  • 测试 3:CCIP 消息发送的 gas 成本和最终确认时间
  • 测试 4:端到端游戏回合延迟
| Metric | Testnet A | Testnet B | Mainnet (simulated) |
|--------|-----------|-----------|---------------------|
| VRF request gas | | | |
| VRF fulfillment gas | | | |
| Price feed read gas | | | |
| CCIP send gas | | | |
| Round latency (seconds) | | | |

常见问题排查

如果您的 VRF 请求失败,请检查您的订阅是否已注资以及消费者合约是否已添加。对于价格喂价,确保您使用的是目标网络的正确喂价地址;错误的地址将返回过时或零价格。CCIP 失败通常源于费用代币不足或路由器地址错误。

使用事件和日志进行调试。对于 VRF,监听 RandomWordsRequested 和 RandomWordsFulfilled 事件。对于价格喂价,验证 updatedAt 时间戳是最近的。始终在主网之前先在测试网上测试。

  • VRF:订阅余额、消费者注册、密钥哈希有效性
  • 价格喂价:喂价地址、网络兼容性、心跳
  • CCIP:路由器地址、费用代币余额、链选择器

局限性与权衡

基于预言机的游戏引入了对外部网络的依赖。VRF 请求是异步的;玩家必须等待完成。价格喂价有心跳,在极端波动期间可能过时。CCIP 增加了跨链延迟和费用。

考虑您的游戏是否真正需要链上随机数或价格数据。对于某些机制,提交-揭示方案或带有定期链上结算的中心化服务器可能更高效。评估预言机费用与游戏经济的成本对比。

后续步骤与进一步阅读

从在测试网上原型设计一个简单游戏开始。使用 Chainlink 文档获取详细的集成指南。对于 RPC 基础设施,探索 OnFinality 的 API 服务和专用节点以确保与目标链的可靠连接。查看 RPC 定价进行成本规划。

有关区块链游戏开发的更多信息,请参阅我们的区块链节点托管指南。如果您需要帮助为游戏后端选择 RPC 提供商,RPC Assistant 可以推荐合适的端点。

永远不用担心基础设施

OnFinality 消除了 DevOps 的繁重工作,让您能够更聪明、更快地构建。

开始