metadata - 在游戏功能的智能合约中获取代币元数据

标签 metadata solidity ipfs

上下文

我正在开发我的第一个使用智能合约的游戏,我有一些问题。

在我的游戏中,我有角色和卡片,两个玩家将使用一个角色和 10 张卡片互相决斗。

为此,没问题:所有玩家和卡牌元数据都存储在 IPFS 存储桶中,一些额外的元数据(如体验)存储在智能合约中以供游戏更新。

问题

现在我希望能够在我的智能合约中创建决斗功能。但我不知道如何访问玩家和卡牌元数据才能知道你会赢。

我心中的“解决方案”

  • #1:我从未见过任何 IPFS getter 来获取元数据,也从未见过 JSON 解析器。所以这可能不是做这件事的好方法。

  • #2:我是否必须将 mapping(uint => Players) private playersMetadata; 实现到我的契约(Contract)中并将所有元数据加载到契约(Contract)中可以在决斗功能上使用它吗??

    • 但是#2.1:它会大大增加所需的存储空间!
    • #2.2:我怎样才能加载它?通过创建函数 setPlayer(uint idx, Players playerMetadata) 并创建 10k+ 次该函数?这会让我付出很多代价!
  • #3: 不要在智能合约上实现这个功能,而是在我的网络服务器上实现。但我不喜欢那样,因为我希望用户能够阅读智能合约代码并信任它(但不要相信我)。因此,如果我在服务器端执行此操作,他们将无法信任该功能。

谢谢你帮助我!祝你有个美好的一天

最佳答案

没有同步和直接的方式从智能合约访问链下数据(包括 IPFS,因为它在不同的链上)。

您可以使用 oracle 模式从链下应用程序请求指定的 IPFS 数据,该应用程序将其异步发送回合约(在稍后的 block 中)。但是由于您担心的一个问题是用户对代码的信任,并且这种模式引入了用户无法控制的元素(理论上,离线应用程序可以将与实际存储在 IPFS 上的值不同的值传递给您的合约),我不会深入探讨这种方法。

另一种选择是将战斗逻辑所需的元数据移动到合约中。您可以将交易费用转嫁给用户,这样每次他们想要执行操作(例如创建卡片、更新角色、与其他玩家战斗)时,他们的钱包就会弹出,要求他们支付交易费用。

通常,链上游戏需要传输大量数据。一些游戏作者使用侧链(例如 Axie Infinity 和他们的 Ronin 链,这是连接到以太坊的第 2 层链),总体费用可以显着降低(但没有费用的链会吸引垃圾交易涌入网络)。这也是值得研究的方法之一。

或者,智能合约可能不是适合您的用例的好工具。您还可以使用 Web 技术创建游戏、开源代码、公开获取 getter 端点,以便任何人都可以验证在您的服务器上运行的代码是否确实如您所声称的那样。

关于metadata - 在游戏功能的智能合约中获取代币元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70567465/

相关文章:

php - 在 WooCommerce 订单状态更改时添加用户元数据作为订单元

java - 是否有用于提取 MP4 元数据的 Java API?

solidity - Everscale Solidity。如何与负责任的职能部门合作?如何等待回调?

solidity - 模块未找到错误 : No module named 'knox'

javascript - 如何将 json 文件(或 JavaScript 对象)上传到 NextJS 中的 IPFS?

ipfs - 以编程方式检查 IPFS 上的数据传输

android - faSTLane/supply dynamic 新功能(变更日志)

twitter - Twitter 卡片中 "@@"和 "@"之间的区别

ethereum - 坚固性未定义

来自 jacoco 的 java.lang.NoSuchFieldException 错误