合约

Adrift 智能合约的协议级概述

协议概述

该协议由一组核心合约(执行游戏逻辑、随机性和结果)和辅助合约(工厂、序列模块、工具)组成,共同实现了完全链上、可编程的体验。

架构

  • 核心合约:执行游戏的基本规则和安全保障(注册、签到、结果、随机性)
  • 辅助合约:工厂、序列模块和工具,与核心合约交互,实现可扩展性和可升级性
  • 接口:定义合约边界,支持模块化升级和自定义实现

核心合约

Adrift(游戏逻辑)

主要合约,负责执行注册、签到、取消资格和胜者逻辑。所有游戏玩法均在链上透明进行。

主要职责:

  • 玩家注册和签到
  • 执行签到间隔和取消资格
  • 与结果和随机性模块集成
  • 为所有主要操作发出事件

接口:

interface IAdrift {
    function register(address player) external;
    function checkIn() external;
    function disqualifyInactivePlayer(address player) external;
    function endGame(address player) external;
    function isPlayerActive(address player) external view returns (bool);
    function setGameStartTime(uint256 startTime) external;
    // ...other admin and view functions
}

CheckInOutcomes(结果逻辑)

使用链上随机性确定每次签到的结果(增益、减益、取消资格)。可由管理员配置。

主要职责:

  • 从专用合约中获取随机性
  • 计算每位玩家签到的结果
  • 可配置的结果范围和取消资格概率

接口:

interface ICheckInOutcomes {
    function DISQUALIFIED_OUTCOME() external view returns (int256);
    function OUTCOME_RANGE() external view returns (uint256);
    function getOutcome(address player) external returns (int256);
}

Random(随机性来源)

在此示例应用中,随机性通过 Lit Protocol 提供。Random 合约存储并提供用于结果逻辑的随机性。只有管理员可以更新随机值,随后由结果合约使用。

主要职责:

  • 存储最新的随机值
  • 限制更新权限为管理员/授权角色

接口:

interface IRandom {
    function random() external view returns (uint256);
}

辅助合约

AdriftFactory(游戏工厂)

部署新的 Adrift 游戏实例,实现可升级性和平行游戏。发出事件以便于跟踪。

主要职责:

  • 部署新的 Adrift 合约
  • 触发创建事件

接口:

interface IAdriftFactory {
    function create(address gameAdmin, address checkInOutcomes) external returns (address);
}

CheckInOutcomesFactory(结果逻辑工厂)

部署新的结果逻辑合约,可选择使用新的随机性来源。支持升级和实验。

主要职责:

  • 部署 CheckInOutcomes 和 Random 合约
  • 触发创建事件

接口:

interface ICheckInOutcomesFactory {
    function create(address outcomesAdmin, address randomness) external returns (address);
    function createWithRandom(address outcomesAdmin, address randomAdmin) external returns (address, address);
}

AdriftBundler(排序/打包模块)

处理应用链的交易打包和排序。与 Syndicate 的排序链集成,并可扩展以支持自定义逻辑。

主要职责:

  • 管理交易的内存池
  • 批量处理签到交易
  • 与排序链集成

接口:

interface IAdriftBundler {
    function addRandomness(bytes calldata randomnessTx) external;
    function processTransactionsBulk(bytes[] calldata txns) external;
    function processTransactionUncompressed(bytes calldata txn) external;
    function getMempoolLength() external view returns (uint256);
}

工具和支持合约

  • Decompressor(Stylus,特定于 Arbitrum):一个 Arbitrum Stylus 合约,可在链上低成本解压 calldata。这使得节点可以以压缩模式运行,同时在链上执行解压,从而降低成本。解压后的字节数据随后被输入解码逻辑。
  • RLPTxBreakdown / RLPReader(Solidity):用于从解压后的 calldata 中解码以太坊交易的库,支持自定义排序逻辑。

设计决策

  • 工厂模式:支持可升级性和平行部署,类似于 Uniswap 的单例工厂和配对
  • 模块化接口:所有主要逻辑(游戏、结果、随机性)都通过接口抽象,便于升级
  • 链上强制执行:所有游戏玩法、随机性和结果都在链上强制执行并可审计
  • 事件透明性:所有主要操作都会触发事件,便于索引和前端集成
  • Arbitrum Stylus 用于解压:使用 Stylus 合约在链上解压 calldata,使节点能够以压缩模式运行,并在 Solidity 解码之前最小化 L1 占用。RLPReader

通过遵循这些模式,您可以构建强大、透明且可升级的应用链,充分利用 Syndicate 的模块化架构的全部功能。