Proof of Play 团队为了实现web3游戏的大规模应用,构建了一套Gasless、Signless、Seamless的游戏体验系统。该系统通过Game Wallet和Meta Transactions(EIP-2771)技术,让玩家只需授权一次即可在游戏中无gas费、无弹窗、无需签名地进行游戏操作,极大地降低了玩家进入web3游戏的门槛,并节省了大量的gas费用。
在 Proof of Play,我们正在构建产品和系统,以实现 web3 驱动游戏的大规模采用。在我们所做的一切中,我们都挑战自己,为我们的玩家创造真正令人愉快且无摩擦的体验。
实现无缝游戏体验:深入了解 Pirate Nation
这篇博文将介绍我们构建的系统,以使我们的游戏玩法完全实现:Gasless(无 Gas 费)、Signless(无签名)和 Seamless(无缝),因此,我们为玩家节省了近 100 万笔交易和约 15 万美元的 Gas 成本。
当然,让我们从最简单也是最重要的问题开始:为什么——为什么这很重要?因为从玩家入门和游戏玩法中抽离复杂性,对于实现大众市场采用,并吸引不仅仅是 web-3 原生玩家至关重要。
在过去的几年里,我们看到许多优秀的团队构建了出色的产品,但放弃了尽可能减少入门摩擦的努力,这严重阻碍了他们的增长。
没有人希望游戏或其他快速移动/高使用率的应用程序被无休止的弹出窗口、交易批准、网络更改所困扰,或者需要在 DEX 上购买一个随机 Token 才能参与,设置一个新的钱包,管理私钥,在土星上通过燃烧的铁环向后翻转三周半,同时还要在鼻子上平衡一个吃了一半的 Twinkie 蛋糕…… 不。更不用说诈骗的风险了。
过多的交易……不是我们想要的。这不是大众采用的样子。
为了先说结论:玩家使用其主钱包一次性授权游戏钱包,此后,这个辅助钱包就能够执行游戏内操作,例如任务、制作等,无需:
➜ 费用
➜ 弹出窗口
➜ 待签名的交易
游戏钱包 🤝 更好的用户引导 🤝 无缝游戏体验
游戏钱包由两项无缝配对的技术组成:
游戏钱包是一个本地存储的钱包,不存储资金,也不存储玩家资产。当玩家登录 Pirate Nation 时,他们使用 getOperatorAccountRegistrationMessageToSign() 签名一条人类可读的消息,确认他们授权此钱包代表他们的主钱包在 Pirate Nation 游戏合约中执行交易。这与 delegate.cash 类似。
/**
* 调用此方法是为了检索要签名的消息,以注册一个 operator
*
* @param player address operator 正在为其注册
* @param operator address 要注册的 operator 的地址
* @param expiration 注册的区块时间 (如果无限期则为 0)
* @param blockNumber 消息被签名的区块高度
*/
function getOperatorAccountRegistrationMessageToSign(
address player,
address operator,
uint256 expiration,
uint256 blockNumber
) public pure returns (bytes memory) {
return
abi.encodePacked(
"Authorize operator account ",
Strings.toHexString(uint256(uint160(operator)), 20),
" to perform gameplay actions on behalf of player account ",
Strings.toHexString(uint256(uint160(player)), 20),
" with expiration ",
Strings.toString(expiration),
" signed at block ",
Strings.toString(blockNumber)
);
}
然后,此签名被传递给 registerOperator() 函数,该函数将游戏钱包的地址与玩家关联起来。
此钱包可以执行的操作仅限于使用名为 getPlayerAccount() 的函数在合约中定义的游戏操作。
if (operatorAddress == address(0)) {
revert InvalidOperatorAddress();
}
PlayerAccount memory account = _operatorToPlayerAccount[\
operatorAddress\
];
address playerAddress = account.playerAddress;
if (playerAddress != address(0)) {
if (
account.expiration < block.timestamp && account.expiration != 0
) {
revert OperatorExpired();
}
} else {
return operatorAddress;
}
return playerAddress;
}
必须给出明确的指示,才能通过此钱包接受操作,例如在 Pirate Nation Holding System 中:
/**
* 声明给定 Token 的里程碑
*
* @param tokenContract 正在持有的 Token 的合约
* @param tokenId 正在持有的 Token Id
* @param milestoneIndex 要为此 Token 声明的里程碑的索引
*/
function claimMilestone(
address tokenContract,
uint256 tokenId,
uint16 milestoneIndex
) external whenNotPaused nonReentrant {
address account = _getPlayerAccount(_msgSender());
_claimMilestone(account, tokenContract, tokenId, milestoneIndex);
emit MilestoneClaimed(account, tokenContract, tokenId, milestoneIndex);
}
这很重要,因为这意味着即使有人以某种方式获得了此钱包的访问权限……那么他们能做的最糟糕的事情就是代表玩家进行任务、制作或执行其他简单的游戏操作——而玩家的资产仍然安全地保存在他们的主钱包中。此外,如果玩家不希望将游戏钱包与他们的帐户关联,则该逻辑以这样一种方式运行:如果玩家愿意,他们可以使用主钱包签名交易。
我们用于创建无摩擦体验的第二项技术是称为元交易的标准 (EIP-2771)。玩家在本地签名一个授权游戏操作的交易,但它不是直接广播到区块链,而是通过一个中继服务器(API 服务器)发送,该服务器代表他们广播(同时也支付费用)。
第二步是中继服务器通过一个受信任转发合约广播此信息,该合约验证签名并将交易转发到游戏合约。这使得玩家只需要授权交易,而不需要拥有他们正在广播的网络的 Token 才能确认交易本身。这允许玩家在无需拥有或了解任何 Token 的情况下玩 Pirate Nation。
单独而言,这两项改进都减少了与区块链游戏相关的摩擦,并且当它们配对在一起时,玩家可能永远不会意识到他们正在玩一款链上游戏。
我们的玩家可以登录并玩 Pirate Nation,而无需使用他们的主钱包确认交易(在初始交易之后),无需在空钱包上操作,也无需切换网络或知道他们是否在以太坊、Arbitrum 或其他 L2 上。
由于此钱包的范围有限——如果此钱包转移到另一台设备,例如手机,则可以在不访问主钱包的情况下玩游戏。
虽然这篇博客是为我们的区块链爱好者撰写的,但如果你是 Pirate Nation 玩家,那么进入游戏时你只会看到这个弹出窗口,以及授权 Gasless & Signless 游戏体验的第一个交易。简单。
欢迎来到你需要签名的第一个也是最后一个交易才能玩我们的游戏。
我们认为,构建大众市场游戏的最佳方式是通过首先将它设计成一款伟大的游戏,而不是一款“伟大的加密游戏”的视角来进行设计。
通过这个框架,Proof of Play 将继续从玩家体验中抽离复杂性,并提升 web3 驱动游戏的未来。虽然我们相信我们可以(并且将会)做更多的事情来改善体验,但我们相信这是区块链游戏生态系统朝着正确方向迈出的一大步。
有兴趣更深入地了解我们的 Gasless & Signless 系统吗?查看 我们的文档,我们的 已验证合约,或在 Discord 中联系团队并询问开发人员。
前进!
Proof of Play 团队
- 原文链接: piratenation.medium.com/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!