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 Protocoldrand 将可验证的随机性注入排序器,为游戏事件提供支持。

索引的关键合约

  • 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 的排序器设计为您的项目服务。