边玩边赚(常写作 play-to-earn 或 P2E)指为游戏内活动发放代币或 NFT 的区块链游戏。奖励的真实性取决于其背后的链上状态,因此实用技能是验证:读取合约、检查支付交易,并扣除 Gas 和交易市场费用。本指南解释奖励机制,提供可运行的基于 RPC 的支付检查,并展示如何构建可重复的测量表,而不是轻信游戏的营销数字。最后讨论区分可持续经济与短命经济的权衡。
范围与直接答案
边玩边赚游戏以链上资产支付玩家:同质化游戏代币、NFT 或两者兼有。支付是一笔交易,和任何交易一样,它可以被检查、计时和定价。这使得边玩边赚评估既是一个游戏问题,也是一个基础设施问题。
对“边玩边赚游戏真的会支付吗?”的直接答案是:有些会,但你保留的金额是总奖励减去 Gas、交易市场费用和活动的时间成本,并且以价格波动的资产计价。一个在领取时价值很小的 100 枚代币奖励,在仪表盘上可能看起来慷慨,在钱包里却令人失望。
本文介绍如何使用标准 JSON-RPC 调用端到端验证奖励,如何构建可重复运行的测量表,以及预期会出现哪些故障模式。它不推荐具体游戏;游戏发现属于目录的范畴,而下面的验证方法与游戏无关。
- 假设:你拥有游戏所在链的 RPC 端点,以及一个收到奖励的钱包地址。
- 假设:你可以阅读游戏的公开合约或文档,获取奖励代币地址。
- 范围之外:游戏奖励的法律或税务处理,这因司法管辖区而异。
边玩边赚奖励如何在链上发放
大多数边玩边赚经济遵循三种模式之一。在领取时铸造模式中,玩家调用领取函数,游戏合约向玩家铸造新代币,受冷却时间或上限约束。在国库转账模式中,合约持有预存余额,并在领取时转账代币。在链下账本定期结算模式中,游戏在数据库中跟踪积分并批量支付,因此链上交易稍后到达,可能覆盖许多玩家。
每种模式都会改变你可以验证的内容。领取时铸造和国库转账会立即显示为来自或发往游戏合约的交易。批量结算意味着你的个人奖励可能出现在更大交易中的一笔转账里,因此你需要检查日志,而不仅仅是顶层转账。
NFT 奖励增加了第二层:代币 ID、元数据 URI 和版税配置决定了资产是否具有流动性以及出售成本。一个创作者版税高且交易市场流动性稀薄的奖励 NFT,其价值可能远低于其挂牌价格所暗示的价值。
可复现奖励检查的先决条件
在测量任何内容之前,收集四项信息:链 ID、游戏的奖励合约地址、奖励代币地址(或 NFT 合约),以及你收到或观察到的支付交易哈希。有了这些,下面的每项检查都是确定性的。
你还需要一个 RPC 端点。公共端点通常会限速或修剪日志,这会破坏历史查询;专用端点可以避免这种情况。OnFinality 的多链 RPC 端点覆盖许多游戏链,你可以在 RPC 定价页面比较套餐。如果你正在为游戏经济运行自己的索引器,专用节点可为重复日志扫描提供稳定的吞吐量。
将端点存储在环境变量中,以便相同的脚本可以跨链使用:
- 游戏网络的链 ID(确认与你使用的 RPC 匹配)。
- 来自官方文档的奖励代币或 NFT 合约地址。
- 一笔支付交易哈希,可以是你的,也可以来自公共浏览器。
- 你打算扫描的区块号范围,保持较小以避免超时。
export RPC_URL="https://your-endpoint.example"
export GAME_CONTRACT="0xGameContractAddress"
export REWARD_TX="0xPayoutTransactionHash"第 1 步:确认支付交易及其状态
从交易收据开始。状态为 0x1 表示交易成功;0x0 表示交易回滚,没有奖励转移,无论游戏 UI 显示什么。收据还提供日志、使用的 Gas 和有效 Gas 价格,这些是成本计算所需的。
针对你的端点运行以下命令:
- 首先检查
status;回滚的领取是最常见的误报。 - 记录
gasUsed和effectiveGasPrice,用于净收益计算。 - 记下
blockNumber,以便后续日志查询使用相同的区块。
curl -s "$RPC_URL" \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_getTransactionReceipt",
"params": ["'"$REWARD_TX"'"]
}'第 2 步:解码转账日志以找到实际金额
顶层交易可能是领取调用、批量结算或代理调用。你收到的金额存在于 ERC-20 Transfer 事件或 ERC-721 Transfer 事件中。按奖励代币地址和你的钱包地址过滤日志,以隔离你的支付。
ERC-20 Transfer 主题哈希为 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef。to 字段是你的地址,左填充至 32 字节。此 Python 片段仅使用标准库:
- 将原始金额除以代币合约
decimals()调用返回的 10^decimals。 - 如果没有匹配的日志,奖励可能已批量发送到不同地址或以不同代币支付。
- 对于 NFT 奖励,第三个主题是代币 ID 而非金额。
import json, os, urllib.request
rpc = os.environ["RPC_URL"]
tx = os.environ["REWARD_TX"]
wallet = os.environ["WALLET"].lower().replace("0x", "")
def call(method, params):
body = json.dumps({"jsonrpc": "2.0", "id": 1, "method": method, "params": params}).encode()
req = urllib.request.Request(rpc, body, {"Content-Type": "application/json"})
return json.load(urllib.request.urlopen(req))["result"]
receipt = call("eth_getTransactionReceipt", [tx])
topic_to = "0x" + wallet.rjust(64, "0")
transfer_topic = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
for log in receipt["logs"]:
if log["topics"][0] == transfer_topic and log["topics"][2] == topic_to:
raw = int(log["data"], 16)
print("token", log["address"], "raw amount", raw)第 3 步:为奖励定价并减去成本
奖励只有在你可以在游戏之间比较的单位中才有意义。使用你信任的价格源将代币金额转换为通用单位,然后减去你支付的领取 Gas 以及退出时需支付的任何交易市场费用。结果就是该次领取的净奖励。
为你观察到的每次领取构建如下表格。在测量之前将数值单元格留空;不要用游戏仪表盘的估算值填充它们。
- | 字段 | 来源 | 示例格式 |
- | 总代币金额 | 转账日志,除以 10^decimals | 125.0 GAME |
- | 领取时代币价格 | 你选择的价格源,带时间戳 | $0.04 |
- | 总价值 | 金额 × 价格 | $5.00 |
- | 领取 Gas 成本 | gasUsed × effectiveGasPrice × 原生代币价格 | $0.12 |
- | 退出费用 | 代币的交易市场或 DEX 费用 | 2% |
- | 净价值 | 总价值 − Gas − 退出费用 | $4.78 |
- | 花费时间 | 你自己的活跃分钟日志 | 45 分钟 |
第 4 步:在信任费率之前验证合约的奖励规则
游戏通常宣传合约并不保证的收益率。阅读奖励合约的公共函数和事件,了解费率是固定的、由管理员密钥控制,还是取决于国库余额。国库转账模式可以支付直到余额耗尽;领取时铸造模式可能膨胀供应并压低价格。
有用的检查包括游戏合约持有的国库代币余额、是否存在暂停或管理员提取函数,以及领取上限是在链上执行还是仅在游戏服务器中执行。如果上限仅存在于链下,你的链上验证无法确认它们,你应将宣传的费率视为政策而非保证。
对于需要历史状态或归档访问来检查旧领取的链,在依赖结果之前确认你的提供商支持它。网络目录列出了支持的链及其能力。
预期验证结果及如何解读
成功的验证产生四个事实:交易成功、奖励金额与代币小数位匹配、接收地址是你的,以及扣除 Gas 和退出费用后的净价值对你花费的时间为正。如果其中任何一项失败,该领取对你来说就不是真实的收益事件。
一个常见的意外是总金额正确,但在拥堵链上扣除 Gas 后净值为负。另一个是奖励以没有流动市场的代币到达,因此退出费用实际上是 100%。两者都是该方法的合法结果,而不是方法中的错误。
为每一行记录区块号和时间戳。奖励率和代币价格会变化,没有时间戳的表格无法跨周比较。
常见验证失败的故障排除
当检查失败时,原因通常是少数问题之一。在得出结论认为游戏没有支付之前,按顺序逐一排查。
- 未找到收据: 交易可能待处理或在不同的链上;确认你的 RPC 的链 ID 与游戏匹配。
- 状态 0x0: 领取回滚,通常由于冷却时间、上限或国库不足;游戏 UI 可能仍显示待处理奖励。
- 没有匹配的 Transfer 日志: 支付可能已批量处理、发送到托管地址,或以你未预期的代币计价。
- 日志查询超时: 公共端点通常限制
eth_getLogs范围;缩小区块范围或使用专用端点。 - 金额看起来差了 10 倍或 1000 倍: 你跳过了代币的
decimals();始终从合约读取它。 - 净价值为负: Gas 或退出费用超过了奖励;这是真实结果,不是错误。
链上奖励测量的局限与权衡
链上验证告诉你支付了什么,而不是游戏是否有趣或经济是否可持续。一个游戏可以准确支付,但当排放超过代币需求时仍会崩溃。相反,一个经济健康的游戏可能以增加个人验证难度的方式批量支付。
测量本身也有成本。扫描日志和为代币定价需要时间和 RPC 容量,在高吞吐量链上日志量可能很大。对于单次领取,公共端点通常足够;对于跨许多玩家的重复仪表盘,你需要稳定的基础设施,可能还需要索引器。此时,专用节点或托管 RPC 套餐变得比重试被限速的请求更便宜。
最后,匹配、反作弊和积分账本等链下组件对 RPC 不可见。奖励可以在链上完全验证,而生成它的活动仍然无法验证。将链上层视为结算层,而不是整个游戏。
后续步骤:构建可重复的收益检查
将上述步骤转化为每次领取后运行的小脚本:获取收据、解码转账、为代币定价,并向表格追加一行。将 RPC URL 保存在环境变量中,以便无需编辑代码即可切换链。
如果你正在构建游戏或奖励仪表盘而不是玩一个游戏,同样的方法适用于大规模场景:从奖励合约索引 Transfer 事件,将其与区块时间戳一起存储,并连接到价格源。从 RPC 端点指南开始了解基础知识,然后选择支持你所需日志范围和链的提供商。对于按链选择端点,RPC Assistant 的多链端点指南是此验证工作流的实用伴侣。
最重要的习惯是区分文档化行为、你自己的测量和建议。游戏的文档告诉你它打算支付什么;你的表格告诉你它实际支付给你什么。