合约
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 的模块化架构的全部功能。