排序
Adrift 如何利用 Syndicate 的模块化排序器架构实现链上游戏
Adrift 是一个实时的生产示例,展示了 Syndicate 的模块化排序器架构如何支持新型链上应用。以下是其在合约层面的工作原理:
模块化排序器架构
Syndicate 的排序器并非单一的服务,而是一组可以组合和扩展的智能合约(模块)。主要的模块类型包括:
- 权限模块: 谁可以排序交易(例如,白名单、代币持有者、拍卖赢家)
- 排序模块: 如何对交易进行排序和批处理(例如,先进先出(FIFO)、自定义逻辑)
- 自定义模块: 任何额外的逻辑,例如随机性注入、MEV 保护或特定游戏规则
Adrift 使用了一个名为 AdriftBundler 的自定义模块来实现特定游戏的排序和随机性。
AdriftBundler 合约
AdriftBundler 合约是一个自定义排序模块的具体示例。其功能包括:
- 内存池管理: 当玩家提交签到时,捆绑器会解码交易(使用
RLPTxBreakdown),如果是checkIn()调用,则将其添加到内部内存池中。 - 基于角色的访问控制: 只有拥有
SEQUENCER_ROLE的地址可以处理交易,只有拥有RANDOMNESS_ROLE的地址可以注入新的随机性。 - 随机性协调: 当注入新的随机性时(通过
addRandomness),捆绑器会:- 将随机性交易提交到底层排序链。
- 在单个批处理中处理内存池中的所有待处理签到,确保所有结果都使用最新的随机性确定。
- 批量处理: 捆绑器可以批量处理交易,从而实现高效的游戏回合或批量操作。
关键合约逻辑:
function addRandomness(bytes calldata randomnessTx) external onlyRole(RANDOMNESS_ROLE) {
sequencingAddress.processTransactionUncompressed(randomnessTx);
if (mempool.length != 0) {
sequencingAddress.processTransactionsBulk(mempool);
delete mempool;
emit MempoolCleared();
}
}这确保了所有的签到都在新的随机性设置 之后 解决,从而使结果防篡改且公平。
交易解码与过滤
打包器使用 RLPTxBreakdown 和 RLPReader 来解码原始的 EIP-1559 交易。它检查函数选择器以识别 checkIn() 调用,只有这些调用会被添加到内存池中进行批量处理。
示例:
function _processTransactionUncompressed(bytes memory txn) internal {
RLPTxBreakdown.DecodedTransaction memory decodedTx = RLPTxBreakdown.decodeTx(txn);
if (decodedTx.data.length > 0 && !decodedTx.isContractDeployment) {
// 0x183ff085 = checkIn()
if (getFunctionSelector(decodedTx.data) == hex"183ff085") {
playerContractCheckinNonces[decodedTx.to][decodedTx.from]++;
mempool.push(txn);
emit MempoolUpdated(mempool.length, txn);
return;
}
}
sequencingAddress.processTransactionUncompressed(txn);
}Syndicate 的 Adrift 排序模块的优势
- 可编程性: Adrift 可以精确定义随机性注入的方式和时间,以及交易的批量处理方式。
- 公平性: 一轮中的所有签到都使用相同的随机性解决,结果在批量处理后立即锁定——无重组,无操控。
- 可扩展性: 打包器只是一个模块。开发者可以通过组合额外的模块(参见 核心排序模块)添加权限管理、拍卖或其他自定义逻辑。
- 透明性: 所有排序逻辑都在链上且可审计,而不是隐藏在链下基础设施中。
- 防滥用: 签到流程可以使用每个玩家的随机数使操控行为可检测。结果合约在每次签到时递增一个随机数并将其混入随机性中,而打包器可以维护自己的每个玩家签到计数器,以交叉检查是否存在故意回滚(防止 “Meebits”-style 的攻击)。
开发者如何利用这一模式
- 编写自己的模块: 从 AdriftBundler 或 Syndicate 的基础模块开始,添加自己的批处理、权限管理或随机性逻辑。
- 组合模块: 将权限、排序和自定义模块结合使用,为您的应用链创建独特的排序流程。
- 审计和扩展: 所有逻辑都是开源且在链上的,因此您可以根据需要验证、分叉或扩展。
另请参阅:
通过利用 Syndicate 的模块化排序器架构,Adrift 展示了链上游戏(以及任何应用链)如何实现传统链下排序器无法达到的公平性、可扩展性和透明性。