0xmons (XMON) 是一个实验性的 NFT 项目,它将生成式像素艺术与区块链收藏品相结合。它是模因和 Pokémon 的结合,但多了 30%。它是一个用于召唤神经网络生成的像素怪物的 NFT 平台。[2][3]
0xmons 是一个用于召唤神经网络生成的像素怪物的 NFT 平台。(XMON) 是一种加密货币,并在 Ethereum (ETH) 平台上运行。
每件艺术品都由生成对抗模型 (GAN) 生成。这使得每个 NFT 都是完全独一无二的,并且可以选择将 NFT 数据完全注册在链上。[1]
用户可以查看他们目前创建的所有 0xmons,从 #0 开始。铸造 0xmons NFT 的用户可以选择将他们的收藏品(名称、图像、传说)的全部内容编码到链上。[1]
这些 NFT 像素艺术是由 GAN 的疯狂噩梦创造的。它们由动画程序生成。它们的名字来自大型语言模型。它们完全不是随机的位是从以太坊区块链收集的。[1]
0xmons NFT 的目标是在不依赖 OG 陷阱的情况下引导一种新的有价值的 NFT 资产类别。稀缺性、美学、创作过程和技术是它们受欢迎的基本原因。
除了旗舰 NFT 之外,他们还在努力创建更广泛的 NFT 生态系统的其他有价值的部分。捆绑器允许 NFT 成为通用资产篮子,而多发送器可以廉价地将任何代币发送到任何地方。[3]
他们目前正在努力寻找更多方法来扩展 NFT 背后的技术,为 (XMON) 代币带来实用性,并创造许多很酷的东西。
0xmons 不是可组合意义上的生成项目,它的图像来自生成模型。但是这些图像是从 GAN 生成的,GAN 的大小至少为 1 GB,其中考虑了所有库和模型参数。
没有办法将所需的模型参数直接存储在合约存储中,更不用说实现使所有这些工作所需的棘手的矩阵乘法库了。
此外,这些图像不是由较小的图像构建的,因此我们甚至无法以任何形式依赖预计算来为我们提供提升。[1]
他们使用的解决方案不会将 GAN 移到链上。它也不会将直接图像移到合约存储中。相反,他们从 2017 年的一个关于将胸部放在区块链上的项目中汲取了一些经验。他们公然地利用廉价的 calldata。[2]
此外,直接存储 0xmon 图像不是很可行。该模型无法存储在链上,因为它显然大大超过了 24kb 的限制,以及为什么他们无法从较小的部分组成图像(没有用于创建图像的组合)。
所有这些的原因当然是 gas 成本。目前,将 uint256(即 256 位 = 32 字节)直接存储到智能合约存储中需要 20,000 gas。
即使使用无损 GIF 压缩,0xmons 图像的大小也从 10kb 到 50kb 不等。假设非常密集的打包,进行完整写入的成本仍然约为 6,000,000 gas,这大约是区块 gas 限制的一半。这还只是最保守的一面!
合约存储很昂贵,但 calldata 存储却不然。2019 年对 EVM 的更新将存储一个字节的 gas 成本更改为仅 16 gas。这意味着如果我们上传完整的 0xmons 动画,我们将看到大约 400,000 到 2,000,000 gas 的成本。这更容易管理。但是,这也是权衡取舍的地方。合约存储始终可访问。Calldata 不是。Calldata 仅由完整节点保存,虽然它对于准确重建区块链是必需的,但它可能不会保存在快速节点和轻客户端上。[1]
Calldata 是指传递给函数的输入,因此我们所需要做的就是进行函数调用来记录我们的数据。但是我们如何访问数据呢?我们可以通过唯一标识每个交易的交易哈希来做到这一点。从那里,我们可以查看通过输入传递到 uploadMon 函数调用中的参数。[2]
在此交易中,从数据字段传入的字节编码了一个 0xmon 的数据,并且可以从任何选择的前端访问它,只要可以连接到节点即可。借助 Infura 和 Etherscan 等工具,通常可以获得此类信息。但是,其他智能合约也无法获得此数据。这是使用 calldata 的另一个缺点(除了连接到完整节点的可用性之外)。对于 0xmons 项目,决定权衡取舍是值得的,以便能够以最经济的方式编码完整的动画。[3]
然后,一旦输入被存储,交易哈希就可以保存在合约上的映射中,以便很容易知道将来要查找哪个哈希。不幸的是,还有一个问题——交易无法访问它们自己的哈希。这意味着它们不能在一个函数调用中同时存储数据(通过输入)和更新链上映射。所以实际发生的是:首先,我们进行一个“空”交易来存储编码的数据。然后,我们调用注册表合约来存储第一个交易的交易哈希。[3]
鉴于这些图像都是像素艺术,一个直接的想法可能是通过将像素信息密集地打包到 uint256 中来获得额外的巧妙性,也许可以参考另一个值到十六进制颜色的映射。已经尝试过这种方法,但效率不高。事实证明,使用 gifsicle 优化后的原生 GIF 编码仍然做得更好。[2]
现在,让我们来回顾一下进行链上编码的实际过程。首先,您只能编码您拥有的 0xmons。如果您转到您拥有的 0xmon 的页面,您将在底部看到一个新菜单:
有一个下拉菜单,可让您在静态和动画之间进行选择。这指的是 0xmon 图像。在这两种情况下,名称、绰号和传说也将被编码到有效负载中。即使 400,000-2,000,000 gas 的估计值对于编码 0xmon 来说“更合理”,但还有一个额外的选项可以仅编码静态图像,这应该便宜大约 10 倍,即大约 40,000 到 200,000 gas 来编码。
如果这是用户第一次使用,并且您希望前端处理所有事情,只需选择您是否希望编码静态或动画图像,然后单击“上传”按钮。如上图所述,您必须接受三个交易才能使事情正常进行。第一个交易将图像编码到输入字段中。第二个交易批准注册表合约花费 XMON 作为注册费,第三个交易实际上将交易哈希添加到合约的映射中。[1]
如果您仅发送第一个交易并想返回进行实际注册,只需保存编码交易的交易哈希(即进行 uploadMon 函数调用的交易),然后将其粘贴到输入字段中。然后,您可以随意注册。
精明的读者可能已经注意到,将整个静态 0xmon 图像直接编码到合约的存储中仍然是“可行的”。这样做的 gas 成本仍然非常高,从 1,000,000 到 4,000,000 gas 不等,这仅适用于非动画图像。尽管如此,对于那些有 ETH 可以燃烧的纯粹主义者,我还添加了一个直接上传选项,该选项将编码的有效负载直接写入合约。前端现在完全支持这一点,并且这样做的人将获得一个闪烁的闪电图标(而不是普通的闪电图标)。[1]
闪电按钮让其他人知道您已将静态数据编码到链上,而锁定按钮让其他人知道您已将动画数据编码到链上。您也可以单击该图标以将您带到新的 0xmons 展示页面,该页面直接从链上读取和解码。[3]
因此,当此过程完成后,您的 0xmon 将在前端获得两个闪亮的新图标。