在游戏功能的智能合约中获取代币元数据
Get token metadata inside the smart-contract for game functions
上下文
我正在开发我的第一个使用智能合约的游戏,我有一些问题。
在我的游戏中,我有角色和卡片,双方玩家将使用一个角色和 10 张卡片互相决斗。
为此,没问题:所有玩家和卡牌元数据都存储在 IPFS 存储桶中,一些额外的元数据(如体验)存储在智能合约中以供游戏更新。
问题
现在我希望能够在我的智能合约中创建决斗功能。但我不知道如何访问玩家和卡牌元数据才能知道你会赢。
我心中的“解决方案”
#1: 我从未见过任何 IPFS 获取器来获取元数据,也没有看到 JSON 解析器..所以这可能不是好方法去做。
#2: 我是否必须在我的合同中实施 mapping(uint => Players) private playersMetadata;
并在其上加载所有元数据才能在决斗功能??
- 但是#2.1: 会大大增加存储空间!
- 和#2.2:我怎样才能加载它?通过创建一个函数
setPlayer(uint idx, Players playerMetadata)
并铸造这个函数 10k+ 次?这会让我付出很多代价!
#3: 不要在智能合约上实现这个功能,而是在我的网络服务器上实现。但我不喜欢那样因为我希望用户能够阅读智能合约代码并信任它(但不要相信我)。因此,如果我在服务器端执行此操作,他们将无法信任该功能。
谢谢你帮助我!祝大家有个美好的一天
没有同步和直接的方式从智能合约访问链下数据(包括 IPFS,因为它在不同的链上)。
您可以使用 oracle 模式从链下应用程序请求指定的 IPFS 数据,该应用程序将其异步发送回合约(在稍后的块中)。但是由于您担心的一个问题是用户对代码的信任,并且这种模式引入了用户无法控制的元素(理论上,离线应用程序可以将与实际存储在 IPFS 上的值不同的值传递给您的合约),我不会深入探讨这种方法。
另一种选择是将战斗逻辑所需的元数据移动到合约中。您可以将交易费用转嫁给用户,因此每次他们想要执行操作(例如创建卡片、更新角色、与其他玩家战斗)时,他们的钱包都会弹出要求他们支付交易费用。
通常,链上游戏需要传输大量数据。一些游戏作者使用侧链(例如 Axie Infinity 和他们的 Ronin 链,这是连接到以太坊的第 2 层链),其中总体费用可以显着降低(但没有费用的链会吸引垃圾交易涌入网络)。这也是值得一看的方法之一。
或者,智能合约可能不是适合您的用例的好工具。您还可以使用 Web 技术创建游戏,开源代码,使 getter 端点公开可用,以便任何人都可以验证在您的服务器上运行的代码是否确实如您所声称的那样。
上下文
我正在开发我的第一个使用智能合约的游戏,我有一些问题。
在我的游戏中,我有角色和卡片,双方玩家将使用一个角色和 10 张卡片互相决斗。
为此,没问题:所有玩家和卡牌元数据都存储在 IPFS 存储桶中,一些额外的元数据(如体验)存储在智能合约中以供游戏更新。
问题
现在我希望能够在我的智能合约中创建决斗功能。但我不知道如何访问玩家和卡牌元数据才能知道你会赢。
我心中的“解决方案”
#1: 我从未见过任何 IPFS 获取器来获取元数据,也没有看到 JSON 解析器..所以这可能不是好方法去做。
#2: 我是否必须在我的合同中实施
mapping(uint => Players) private playersMetadata;
并在其上加载所有元数据才能在决斗功能??- 但是#2.1: 会大大增加存储空间!
- 和#2.2:我怎样才能加载它?通过创建一个函数
setPlayer(uint idx, Players playerMetadata)
并铸造这个函数 10k+ 次?这会让我付出很多代价!
#3: 不要在智能合约上实现这个功能,而是在我的网络服务器上实现。但我不喜欢那样因为我希望用户能够阅读智能合约代码并信任它(但不要相信我)。因此,如果我在服务器端执行此操作,他们将无法信任该功能。
谢谢你帮助我!祝大家有个美好的一天
没有同步和直接的方式从智能合约访问链下数据(包括 IPFS,因为它在不同的链上)。
您可以使用 oracle 模式从链下应用程序请求指定的 IPFS 数据,该应用程序将其异步发送回合约(在稍后的块中)。但是由于您担心的一个问题是用户对代码的信任,并且这种模式引入了用户无法控制的元素(理论上,离线应用程序可以将与实际存储在 IPFS 上的值不同的值传递给您的合约),我不会深入探讨这种方法。
另一种选择是将战斗逻辑所需的元数据移动到合约中。您可以将交易费用转嫁给用户,因此每次他们想要执行操作(例如创建卡片、更新角色、与其他玩家战斗)时,他们的钱包都会弹出要求他们支付交易费用。
通常,链上游戏需要传输大量数据。一些游戏作者使用侧链(例如 Axie Infinity 和他们的 Ronin 链,这是连接到以太坊的第 2 层链),其中总体费用可以显着降低(但没有费用的链会吸引垃圾交易涌入网络)。这也是值得一看的方法之一。
或者,智能合约可能不是适合您的用例的好工具。您还可以使用 Web 技术创建游戏,开源代码,使 getter 端点公开可用,以便任何人都可以验证在您的服务器上运行的代码是否确实如您所声称的那样。