
Subscribe to 西门吹雪

Subscribe to 西门吹雪
<100 subscribers
<100 subscribers
Share Dialog
Share Dialog
介绍 本指南将引导您使用空间和时间以及 Chainlink 函数创建动态 NFT。我们将创建一个 SwordNFT,其评级根据剑在游戏中的使用方式而变化。使用 Chainlink 函数更新时空游戏遥测数据并馈送到 NFT 合约。
这是我们完成后 NFT 的样子的示例。
在开始之前,我们应该回答几个重要问题。
什么是动态 NFT(dNFT)? 从简单的角度来看,根据 ERC721(和 ERC1155),不可替代代币应该具有一个存储 URL 的函数,该 URL 将为给定的 NFT 返回 JSON 元数据。该 blob 通常包含指向图像文件的指针、NFT 名称、描述等内容。dNFT 只是一个 NFT,其中 NFT 的元数据旨在更改。tokenURI
但我认为 NFT 不应该改变! ERC721/ERC1155 中没有任何内容表明 NFT 的元数据不能更改。NFT 的元数据不应改变的想法可能来自涉及永久数字收藏品的一个特定用例。虽然对该主题的全面讨论超出了本指南的范围,但重要的是要了解 NFT 可以采取多种形式,并且对可以进化和/或升级的 NFT 的需求不断增加。另外,请记住,重要的是要考虑谁(或什么)可以对 NFT 进行更改、如何进行这些更改以及可以进行更改多长时间。
概述 对于本指南,我们将执行以下高级步骤:
基本设置和配置 先决条件 下载并安装存储库 设置env-enc 空间和时间设置 创建表 插入数据 通过 Chainlink 功能将 SxT 连接到孟买 升级你的剑NFT
基本设置和配置 ❗ 空间和时间以及 Chainlink 函数均处于测试阶段。很可能会对其中一项或两项进行更新,从而改变本指南中步骤的工作方式。您可以在Discord上找到我们并提出问题。
先决条件 您将需要空间和时间以及 Chainlink 函数的测试版访问权限。
如果您是 SxT 新手,建议您首先从我们的SxT 入门指南开始。如果您是 Chainlink Functions 的新手,我们建议您从他们的入门指南开始。对如何连接到 SxT 以及 Chainlink Functions 的工作原理有基本的了解将为您成功阅读本指南做好准备。
显然,您需要 Polygon Mumbai 测试网上的钱包地址,代币余额为2 LINK和0.2 MATIC。
设置 打开终端/命令窗口,导航到您要运行此演示的文件夹,然后在终端窗口中输入以下命令:
从 github 克隆演示存储库,其中包括所有 Solidity 和 js 文件: 如果您没有安装 git,此页面有安装说明。。 git clone https://github.com/SxT-Community/SxT-dNFT.git && cd SxT-DNFT
通过运行以下命令安装所有 Node.js 依赖项:npm install
您安装的软件包之一是 Chainlink Labs 创建的一个方便的工具,用于加密您的本地环境变量。请查看所有可用命令。npx env-enc help
Enter设置您的 root 密码(或解锁您的加密 envar 文件)npx env-enc set-pw
Enter设置以下环境变量,上面的 demo 会用到这些环境变量。命令行应用程序将要求提供变量名称,然后是值。对于每个,输入:env-enc set
POLYGON_MUMBAI_RPC_URL- CL Functions 使用的孟买网络(Infura、Alchemy 等)的 RPC_URL。 例如,查看Infura 的“入门”文档的前两部分。您需要的 RPC_URL 类似于: https://polygon-mumbai.infura.io/v3/your_api_key MUMBAI_RPC_URL- Hardhat 使用的 RPC_URL - 与上面相同的 URL。截至撰写本文时,Hardhat 和 Chainlink 对于 RPC 端点具有不同的环境变量。该值应该 100% 相同。 PRIVATE_KEY- 您的钱包地址的私钥(带有上述 2 个 LINK 和 0.2 MATIC),应该类似于4bb23044e2b4e1b8e3793d6686306915adcc25e35211f08f91c462b36250ac99 POLYGONSCAN_API_KEY- Polyscan 的 API 密钥- 可选,但建议用于验证合同。 API 密钥应类似于: G9JRV6CBJWYMPUGQ7382RKUBNINI44QRUF API_KEY-空间和时间的 API 密钥- 执行链外查询所需的。 API 密钥应类似于: sxt_dMFtbHgkW5_59sND2XMSXuEeOtXzNalSKbvZ API_URL- 空间和时间 API URL,其中包含发送查询的网关/秘密代理端点。URL 应类似于: https://proxy.api.spaceandtime.app/v1/sql 2. 空间和时间设置 设置空间和时间数据 📘 连接到 Space and Time 的方法有很多,但最简单、最快的是通过Space and Time Studio。
下面是我们将要使用的游戏遥测表 SxT:
表:SXTNFT.GAME_TELEMETRY_ARTHUR
ID 玩家ID 动作类型 成就ID 收藏品ID 等级 商品编号 点 1 1 游戏开始 1 剑NFT 3 剑NFT 1 攻击 1 剑NFT 3 剑NFT 1 防御 1 剑NFT 2 4 1 杀 国王 1 剑NFT 100 5 1 攻击 1 剑NFT 3 6 1 收集 药水A 2 剑NFT 100 7 1 收集 药水B 2 剑NFT 150 8 1 攻击 3 剑NFT 9 上表意味着任何人都可以读取和修改数据。这对于公共演示来说是理想的选择,因为这意味着您可以按原样使用此表进行演示。然而,其他人也可以,并且您可能让其他人同时进行演示,从而导致意想不到的结果。如果您想创建您自己的表版本,请使用以下 SQL来创建表:Public_Write SQL
解释 CREATE TABLE .GAME_TELEMETRY_ARTHUR ( ID INTEGER, GamerId INTEGER, ActionType VARCHAR, AchievementId VARCHAR, collectableId VARCHAR, Level_ INTEGER, ItemId VARCHAR, Points INTEGER, PRIMARY KEY (ID) ) WITH "public_key=, access_type=public_write, template=PARTITIONED, atomicity=transactional" 删除表中可能已使用 DML 端点的任何记录: SQL Delete From SXTNFT.GAME_TELEMETRY_ARTHUR INSERT 数据 - 这是游戏将其遥测数据插入 SxT 的位置: SQL 解释 INSERT INTO SXTNFT.GAME_TELEMETRY_ARTHUR (ID, GamerId, ActionType, AchievementId, collectableId, Level_, ItemId, Points) VALUES (1, 1, 'Game Started', '', '', 1, 'SwordNFT', 3), (2, 1, 'Attack', '', '', 1, 'SwordNFT', 3), (3, 1, 'Defense', '', '', 1, 'SwordNFT', 2), (4, 1, 'Kill', 'King', '', 1, 'SwordNFT', 100), (5, 1, 'Attack', '', '', 1, 'SwordNFT', 3); 查看加载的数据: SQL SELECT * from SXTNFT.GAME_TELEMETRY_ARTHUR 此外,我们可以运行逻辑来确定 SwordNFT 的当前级别: SQL 解释 SELECT /*! USE ROWS */ ItemId, SUM(Points), CASE WHEN SUM(Points) BETWEEN 100 AND 150 THEN 1 WHEN SUM(Points) BETWEEN 151 AND 300 THEN 2 WHEN SUM(Points) > 300 THEN 3 ELSE '' END AS SWORDFROM SXTNFT.GAME_TELEMETRY_ARTHUR GROUP BY ItemId; 应该返回: 文本 ITEMID |SUM(POINTS)|SWORD| --------+-----------+-----+ SwordNFT|111 |1 | 3. 通过 Chainlink 功能将 SxT 连接到孟买 现在我们在 SxT 中拥有了游戏遥测表,我们将把所有内容连接起来。以下步骤改编自Chainlink Functions 存储库,如果您在设置 Chainlink Functions 时遇到任何问题,这些步骤可能会作为有用的资源。 我们要做的第一件事是模拟完整的交互。这很有帮助,因为它允许我们在部署 dNFT 合约之前识别潜在问题。 在您的终端窗口(与上面通过设置环境变量的窗口相同)中输入以下步骤:env-enc set 测试/模拟 npx hardhat functions-simulate-script 将我们的合约部署到孟买: npx hardhat functions-deploy-consumer --network polygonMumbai --verify true 从上一步的结果中获取合约地址并设置一个临时 envar: export CONTRACT_ADDRESS= 使用Chainlink Functions UI创建新的 Functions 计费订阅并为其提供资金,并将已部署的消费者合约作为授权消费者添加到您的订阅中。您还可以通过以下方式以编程方式执行此操作: npx hardhat functions-sub-create --network polygonMumbai --amount 2 --contract $CONTRACT_ADDRESS 获取订阅 ID 并设置 shell envar: export SUB_ID= 提示NFT调用Chainlink Functions请求查询空间和时间: npx hardhat functions-request --network polygonMumbai --contract $CONTRACT_ADDRESS --subid $SUB_ID 现在是在 Rarible 上领取 dNFT 合约的绝佳时机! 进入终端:open https://testnet.rarible.com/token/polygon/$CONTRACT_ADDRESS:0 或直接转到 URL,替换为步骤 #3 中的合约地址$CONTRACT_ADDRESS 注意:如果您收到有关合约未添加到订阅中的错误,您可以通过 Web UI 或 CLI 将其作为使用者添加到您的订阅中,如下所示: npx hardhat functions-sub-add --network polygonMumbai --contract $CONTRACT_ADDRESS --subid $SUB_ID 升级你的 dNFT 剑 现在是时候根据加载到 Space and Time 中的新游戏遥测来升级你的 SwordNFT 了。 为 SxT(剑 2)添加更多游戏遥测 SQL INSERT INTO SXTNFT.GAME_TELEMETRY_ARTHUR (ID, GamerId, ActionType, AchievementId, collectableId, Level_, ItemId, Points) VALUES (6, 1, 'Collect', '', 'PotionA', 2, 'SwordNFT', 100); SQL 解释 SELECT /*! USE ROWS */ ItemId, SUM(Points), CASE WHEN SUM(Points) BETWEEN 0 AND 150 THEN 1 WHEN SUM(Points) BETWEEN 151 AND 300 THEN 2 WHEN SUM(Points) > 300 THEN 3 ELSE '' END AS SWORDFROM SXTNFT.GAME_TELEMETRY_ARTHUR GROUP BY ItemId; 游戏提示NFT重新查询时空 测试/模拟 npx hardhat functions-simulate-script 提示NFT调用Chainlink Functions请求查询空间和时间: npx hardhat functions-request --network polygonMumbai --contract $CONTRACT_ADDRESS --subid $SUB_ID 让我们再看看NFT,看看它的变化!只需在终端中输入:或直接转到 URL,替换为步骤 #3 中的合约地址 open
介绍 本指南将引导您使用空间和时间以及 Chainlink 函数创建动态 NFT。我们将创建一个 SwordNFT,其评级根据剑在游戏中的使用方式而变化。使用 Chainlink 函数更新时空游戏遥测数据并馈送到 NFT 合约。
这是我们完成后 NFT 的样子的示例。
在开始之前,我们应该回答几个重要问题。
什么是动态 NFT(dNFT)? 从简单的角度来看,根据 ERC721(和 ERC1155),不可替代代币应该具有一个存储 URL 的函数,该 URL 将为给定的 NFT 返回 JSON 元数据。该 blob 通常包含指向图像文件的指针、NFT 名称、描述等内容。dNFT 只是一个 NFT,其中 NFT 的元数据旨在更改。tokenURI
但我认为 NFT 不应该改变! ERC721/ERC1155 中没有任何内容表明 NFT 的元数据不能更改。NFT 的元数据不应改变的想法可能来自涉及永久数字收藏品的一个特定用例。虽然对该主题的全面讨论超出了本指南的范围,但重要的是要了解 NFT 可以采取多种形式,并且对可以进化和/或升级的 NFT 的需求不断增加。另外,请记住,重要的是要考虑谁(或什么)可以对 NFT 进行更改、如何进行这些更改以及可以进行更改多长时间。
概述 对于本指南,我们将执行以下高级步骤:
基本设置和配置 先决条件 下载并安装存储库 设置env-enc 空间和时间设置 创建表 插入数据 通过 Chainlink 功能将 SxT 连接到孟买 升级你的剑NFT
基本设置和配置 ❗ 空间和时间以及 Chainlink 函数均处于测试阶段。很可能会对其中一项或两项进行更新,从而改变本指南中步骤的工作方式。您可以在Discord上找到我们并提出问题。
先决条件 您将需要空间和时间以及 Chainlink 函数的测试版访问权限。
如果您是 SxT 新手,建议您首先从我们的SxT 入门指南开始。如果您是 Chainlink Functions 的新手,我们建议您从他们的入门指南开始。对如何连接到 SxT 以及 Chainlink Functions 的工作原理有基本的了解将为您成功阅读本指南做好准备。
显然,您需要 Polygon Mumbai 测试网上的钱包地址,代币余额为2 LINK和0.2 MATIC。
设置 打开终端/命令窗口,导航到您要运行此演示的文件夹,然后在终端窗口中输入以下命令:
从 github 克隆演示存储库,其中包括所有 Solidity 和 js 文件: 如果您没有安装 git,此页面有安装说明。。 git clone https://github.com/SxT-Community/SxT-dNFT.git && cd SxT-DNFT
通过运行以下命令安装所有 Node.js 依赖项:npm install
您安装的软件包之一是 Chainlink Labs 创建的一个方便的工具,用于加密您的本地环境变量。请查看所有可用命令。npx env-enc help
Enter设置您的 root 密码(或解锁您的加密 envar 文件)npx env-enc set-pw
Enter设置以下环境变量,上面的 demo 会用到这些环境变量。命令行应用程序将要求提供变量名称,然后是值。对于每个,输入:env-enc set
POLYGON_MUMBAI_RPC_URL- CL Functions 使用的孟买网络(Infura、Alchemy 等)的 RPC_URL。 例如,查看Infura 的“入门”文档的前两部分。您需要的 RPC_URL 类似于: https://polygon-mumbai.infura.io/v3/your_api_key MUMBAI_RPC_URL- Hardhat 使用的 RPC_URL - 与上面相同的 URL。截至撰写本文时,Hardhat 和 Chainlink 对于 RPC 端点具有不同的环境变量。该值应该 100% 相同。 PRIVATE_KEY- 您的钱包地址的私钥(带有上述 2 个 LINK 和 0.2 MATIC),应该类似于4bb23044e2b4e1b8e3793d6686306915adcc25e35211f08f91c462b36250ac99 POLYGONSCAN_API_KEY- Polyscan 的 API 密钥- 可选,但建议用于验证合同。 API 密钥应类似于: G9JRV6CBJWYMPUGQ7382RKUBNINI44QRUF API_KEY-空间和时间的 API 密钥- 执行链外查询所需的。 API 密钥应类似于: sxt_dMFtbHgkW5_59sND2XMSXuEeOtXzNalSKbvZ API_URL- 空间和时间 API URL,其中包含发送查询的网关/秘密代理端点。URL 应类似于: https://proxy.api.spaceandtime.app/v1/sql 2. 空间和时间设置 设置空间和时间数据 📘 连接到 Space and Time 的方法有很多,但最简单、最快的是通过Space and Time Studio。
下面是我们将要使用的游戏遥测表 SxT:
表:SXTNFT.GAME_TELEMETRY_ARTHUR
ID 玩家ID 动作类型 成就ID 收藏品ID 等级 商品编号 点 1 1 游戏开始 1 剑NFT 3 剑NFT 1 攻击 1 剑NFT 3 剑NFT 1 防御 1 剑NFT 2 4 1 杀 国王 1 剑NFT 100 5 1 攻击 1 剑NFT 3 6 1 收集 药水A 2 剑NFT 100 7 1 收集 药水B 2 剑NFT 150 8 1 攻击 3 剑NFT 9 上表意味着任何人都可以读取和修改数据。这对于公共演示来说是理想的选择,因为这意味着您可以按原样使用此表进行演示。然而,其他人也可以,并且您可能让其他人同时进行演示,从而导致意想不到的结果。如果您想创建您自己的表版本,请使用以下 SQL来创建表:Public_Write SQL
解释 CREATE TABLE .GAME_TELEMETRY_ARTHUR ( ID INTEGER, GamerId INTEGER, ActionType VARCHAR, AchievementId VARCHAR, collectableId VARCHAR, Level_ INTEGER, ItemId VARCHAR, Points INTEGER, PRIMARY KEY (ID) ) WITH "public_key=, access_type=public_write, template=PARTITIONED, atomicity=transactional" 删除表中可能已使用 DML 端点的任何记录: SQL Delete From SXTNFT.GAME_TELEMETRY_ARTHUR INSERT 数据 - 这是游戏将其遥测数据插入 SxT 的位置: SQL 解释 INSERT INTO SXTNFT.GAME_TELEMETRY_ARTHUR (ID, GamerId, ActionType, AchievementId, collectableId, Level_, ItemId, Points) VALUES (1, 1, 'Game Started', '', '', 1, 'SwordNFT', 3), (2, 1, 'Attack', '', '', 1, 'SwordNFT', 3), (3, 1, 'Defense', '', '', 1, 'SwordNFT', 2), (4, 1, 'Kill', 'King', '', 1, 'SwordNFT', 100), (5, 1, 'Attack', '', '', 1, 'SwordNFT', 3); 查看加载的数据: SQL SELECT * from SXTNFT.GAME_TELEMETRY_ARTHUR 此外,我们可以运行逻辑来确定 SwordNFT 的当前级别: SQL 解释 SELECT /*! USE ROWS */ ItemId, SUM(Points), CASE WHEN SUM(Points) BETWEEN 100 AND 150 THEN 1 WHEN SUM(Points) BETWEEN 151 AND 300 THEN 2 WHEN SUM(Points) > 300 THEN 3 ELSE '' END AS SWORDFROM SXTNFT.GAME_TELEMETRY_ARTHUR GROUP BY ItemId; 应该返回: 文本 ITEMID |SUM(POINTS)|SWORD| --------+-----------+-----+ SwordNFT|111 |1 | 3. 通过 Chainlink 功能将 SxT 连接到孟买 现在我们在 SxT 中拥有了游戏遥测表,我们将把所有内容连接起来。以下步骤改编自Chainlink Functions 存储库,如果您在设置 Chainlink Functions 时遇到任何问题,这些步骤可能会作为有用的资源。 我们要做的第一件事是模拟完整的交互。这很有帮助,因为它允许我们在部署 dNFT 合约之前识别潜在问题。 在您的终端窗口(与上面通过设置环境变量的窗口相同)中输入以下步骤:env-enc set 测试/模拟 npx hardhat functions-simulate-script 将我们的合约部署到孟买: npx hardhat functions-deploy-consumer --network polygonMumbai --verify true 从上一步的结果中获取合约地址并设置一个临时 envar: export CONTRACT_ADDRESS= 使用Chainlink Functions UI创建新的 Functions 计费订阅并为其提供资金,并将已部署的消费者合约作为授权消费者添加到您的订阅中。您还可以通过以下方式以编程方式执行此操作: npx hardhat functions-sub-create --network polygonMumbai --amount 2 --contract $CONTRACT_ADDRESS 获取订阅 ID 并设置 shell envar: export SUB_ID= 提示NFT调用Chainlink Functions请求查询空间和时间: npx hardhat functions-request --network polygonMumbai --contract $CONTRACT_ADDRESS --subid $SUB_ID 现在是在 Rarible 上领取 dNFT 合约的绝佳时机! 进入终端:open https://testnet.rarible.com/token/polygon/$CONTRACT_ADDRESS:0 或直接转到 URL,替换为步骤 #3 中的合约地址$CONTRACT_ADDRESS 注意:如果您收到有关合约未添加到订阅中的错误,您可以通过 Web UI 或 CLI 将其作为使用者添加到您的订阅中,如下所示: npx hardhat functions-sub-add --network polygonMumbai --contract $CONTRACT_ADDRESS --subid $SUB_ID 升级你的 dNFT 剑 现在是时候根据加载到 Space and Time 中的新游戏遥测来升级你的 SwordNFT 了。 为 SxT(剑 2)添加更多游戏遥测 SQL INSERT INTO SXTNFT.GAME_TELEMETRY_ARTHUR (ID, GamerId, ActionType, AchievementId, collectableId, Level_, ItemId, Points) VALUES (6, 1, 'Collect', '', 'PotionA', 2, 'SwordNFT', 100); SQL 解释 SELECT /*! USE ROWS */ ItemId, SUM(Points), CASE WHEN SUM(Points) BETWEEN 0 AND 150 THEN 1 WHEN SUM(Points) BETWEEN 151 AND 300 THEN 2 WHEN SUM(Points) > 300 THEN 3 ELSE '' END AS SWORDFROM SXTNFT.GAME_TELEMETRY_ARTHUR GROUP BY ItemId; 游戏提示NFT重新查询时空 测试/模拟 npx hardhat functions-simulate-script 提示NFT调用Chainlink Functions请求查询空间和时间: npx hardhat functions-request --network polygonMumbai --contract $CONTRACT_ADDRESS --subid $SUB_ID 让我们再看看NFT,看看它的变化!只需在终端中输入:或直接转到 URL,替换为步骤 #3 中的合约地址 open
No activity yet