Chainlink 游戏创意通常围绕可验证随机数(VRF)、现实世界价格数据(价格喂价)和跨链消息传递(CCIP)展开。本文解释了如何设计使用这些预言机服务的游戏,提供了一个简单抽奖游戏和价格预测游戏的可运行代码,并概述了测试和测量流程。文章还涵盖了常见陷阱、权衡以及部署到测试网和主网的后续步骤。重点在于可复现的模式,而非具体的游戏概念。
范围与假设
本文面向希望使用 Chainlink 预言机服务构建链上游戏的开发者。假设读者熟悉 Solidity、Hardhat 或 Foundry 等开发环境,并具备 EVM 网络的基础知识。所示模式与任何支持 Chainlink 的 EVM 链兼容,但请务必在支持的网络页面上验证服务可用性。
我们聚焦于三个核心 Chainlink 服务:可验证随机函数(VRF)用于可证明公平的随机数,价格喂价用于外部市场数据,跨链互操作协议(CCIP)用于多链游戏状态。目标是提供思维模型和实现工作流,而非推荐特定游戏类型。
- Solidity ^0.8.0 及兼容 Chainlink 的网络
- 一个已注资的测试网账户,用于部署和支付预言机费用
- 目标链的 RPC 端点访问权限(参见 RPC 端点指南)
为什么在游戏中使用 Chainlink
区块链游戏通常需要链上原生不可用的输入:安全的随机数、现实世界资产价格或其他链的数据。Chainlink 提供去中心化预言机网络,以密码学保证交付这些输入。对于游戏设计师而言,这实现了诸如具有可验证随机数的战利品箱、由价格喂价结算的预测市场以及跨链锦标赛等机制。
与中心化游戏服务器不同,使用预言机的链上游戏可以提供透明性和防篡改性。然而,它们也引入了延迟和成本考量。在确定设计之前,理解这些权衡至关重要。
游戏机制的核心 Chainlink 服务
Chainlink VRF 生成可在链上验证的随机数。当您的合约请求随机数时,Chainlink VRF 会生成一个证明,证明该数字未被操纵。这非常适合基于概率的机制。
Chainlink 价格喂价提供来自多个来源的聚合价格数据。涉及交易、资产价格投注或基于市场条件的动态难度的游戏可以直接消费这些喂价。
Chainlink CCIP 允许跨区块链发送消息和代币。对于在多个链上拥有资产或逻辑的游戏,CCIP 可以同步状态或转移 NFT。
- VRF:战利品掉落、暴击、随机匹配
- 价格喂价:预测游戏、动态奖励、游戏内经济
- CCIP:跨链资产转移、多链排行榜
使用 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 可以推荐合适的端点。