Indexer
Adrift 索引器的工作原理、Adrift 应用如何使用它,以及它如何利用 Syndicate 的排序器设计。
Adrift 索引器是一项专门的服务,功能包括:
- 索引链上事件,来自 Adrift 应用链及其底层链。
- 聚合并公开游戏状态(玩家、签到、获胜者等),通过对开发者友好的 API 提供服务。
- 读取 Syndicate 的排序器链合约和事件,以支持公平、可验证且防篡改的游戏机制。
架构
+-------------------------------------------------------------------------------------+
| Adrift Frontend |
+-------------------------------------------------------------------------------------+
+-------------------------------------------------------------------------------------+
| Indexer/API |
+-------------------------------------------------------------------------------------+
+-------------------------------------------------------------------------------------+
| Adrift Smart Contracts |
| (Pacifica chain) |
+-------------------------------------------------------------------------------------+
+-----------------------------------------+ +-----------------------------------------+
| Syndicate Sequencing Chain | | Randomness Providers |
| (Risa Testnet) | | (Lit, drand, local) |
+-----------------------------------------+ +-----------------------------------------+- 事件索引: 使用 Ponder 监听 Adrift 应用链(Pacifica)和底层排序器链(Risa Testnet)上的智能合约事件。
- 数据库: 将索引的数据存储在 Postgres 数据库中。
- API 层: 使用 Hono 提供 REST 接口,供 Adrift 应用和其他客户端查询游戏状态并触发操作。
- 随机性集成: 利用 Lit Protocol 和 drand 将可验证的随机性注入排序器,为游戏事件提供支持。
索引的关键合约
-
AdriftFactory
// ponder.config.ts contracts: { AdriftFactory: { chain: "pacifica", abi: AdriftFactoryAbi, address: env.FACTORY_ADDRESS, startBlock: env.START_BLOCK }, // ... } // src/index.ts ponder.on("AdriftFactory:AdriftCreated", async ({ event, context }) => { // Handles new game creation })索引工厂以检测并开始跟踪新创建的游戏。
-
Adrift
// ponder.config.ts Adrift: { chain: "pacifica", abi: AdriftAbi, address: factory({ address: env.FACTORY_ADDRESS, event: parseAbiItem("event AdriftCreated(address indexed gameAddress, ...)") , parameter: "gameAddress" }), startBlock: env.START_BLOCK } // src/index.ts ponder.on("Adrift:PlayerRegistered", ...) ponder.on("Adrift:PlayerCheckedIn", ...) ponder.on("Adrift:GameStartTimeSet", ...) ponder.on("Adrift:GameEnded", ...)索引每个已部署的 Adrift 合约的所有游戏事件。
-
AdriftBundler
// ponder.config.ts AdriftBundler: { chain: "risa", abi: AdriftBundlerAbi, address: env.BUNDLER_ADDRESS, startBlock: "latest" } // src/index.ts索引 Risa 链上的排序器内存池和随机性事件。
数据模型
- Game(游戏): 跟踪游戏状态、开始/结束时间、获胜者等。
- Player(玩家): 注册的玩家地址。
- GamePlayer(游戏玩家): 玩家与游戏的关系、签到状态、取消资格等。
- Checkins(签到): 单个签到事件、增益/减益效果、时间戳。
Adrift 应用如何使用索引器
Adrift 前端通过索引器 API 进行以下操作:
- 加入游戏: 调用
/join在链上注册玩家。 - 获取玩家状态: 调用
/player/:address获取签到状态、下次签到时间、取消资格等信息。 - 排行榜: 调用
/leaderboard获取顶级玩家和游戏状态。 - 心跳: 调用
/heartbeat自动化取消资格和获胜者检测。
UI 中显示的所有游戏状态均由索引器的 API 提供支持,该 API 通过 Ponder 与链保持同步。
API 参考
POST /join
- 为当前游戏注册玩家。
- 请求体:
{ playerAddress: string } - 返回值:
{ success: boolean, hash: string }
GET /player/:address
- 获取玩家状态、签到和状态信息。
- 返回值:
{ data: { ...playerState } }
GET /leaderboard
- 获取顶级玩家和游戏状态。
- 返回值:
{ data: { topPlayers: [...], ...gameState } }
GET /heartbeat
- 触发对非活跃玩家的取消资格和赢家检测。
- 返回值:
{ data: { action: string, ... } }
了解更多
本指南将帮助您理解、运行和扩展 Adrift 索引器,并利用 Syndicate 的排序器设计为您的项目服务。