Twifag

Twifag

I'm just a guy who likes ponies and crypto. I also dabble in Solidity. twifag.eth | ipns://twifag.com/ | https://twifag/ | https://twifag.com/
twitter_id

NFT社交媒体与审查风险

最近出现了许多新的 Web3 社交媒体网站,其中大多数承诺(或暗示承诺)具有抗审查或完全不可审查的特性。 事实是,这些网络实际上是受到审查的,因为它们实现 NFT 代币标准的方式。

什么是 NFT?#

一个非同质化代币(NFT简单来说是在以太坊虚拟机(如以太坊、Polygon、Optimism 等)上的一个合约,它实现了(最常见的)ERC-721ERC-1155标准。 这些文档描述了一个合约被视为 NFT 所必须实现的最低规范。在本文的其余部分,每当我讨论 NFT 时,我将谈论 ERC-721 标准,这是较旧且更广泛实施的 NFT 标准。

NFT 最独特的三个属性使其与同质化代币区分开来:每个 NFT 由一个唯一的数字 ID 表示,没有 NFT 的分数部分(你不能拥有一个的二分之一),每个代币合约实现了tokenURI()函数。

什么是代币 URI?#

一个统一资源标识符(URI一串唯一的字符序列,用于标识由网络技术使用的逻辑或物理资源。 我们通常想到的是http://https:// URLs(这是一种特定类型的 URI,了解更多请访问维基百科),在 NFT 方面,tokenURI()函数返回的代币 URI 通常是这些类型的 Web URL。

上述相同的 ERC-721 规范还定义了一个代币元数据标准,用于描述 NFT。 这通常指向一个托管在网站上的JSON文件,内容大致如下:

{
	"description": "这是这个特定NFT的描述。",
	"external_url": "https://example.com/",
	"image": "https://example.com/image.png",
	"name": "NFT名称",
	"properties": {
		"anything": "值在这里!"
	}
}

image属性是像OpenSea这样的网站通常用来显示你的 NFT 的图像的方式,也是大多数 NFT 与 “艺术” 相关联的方式。 description字段也经常与您的 NFT 一起在同一网站上显示。

审查的风险#

许多基于 NFT 的社交媒体网站喜欢宣称你的所有帖子都存储在区块链上,并且它们是抗审查的。 不幸的是,这些说法往往并不完全正确。

如上所述,特定 NFT 的tokenURI()通常位于由社交媒体网站运行的Web 服务器上。 这个 Web 服务器通常在该社交媒体平台的直接控制之下,这意味着他们可以修改在代币 URI 链接返回的 JSON,以他们想要的任何内容。 远非 “存储在区块链上” 或 “无审查环境”,这些网站实际上并没有在区块链上存储任何数据,并且可能会受到审查。

再看看tokenURI()函数返回的数据。 记得descriptionimage字段吗? 这些实际上是你社交媒体帖子的内容,唯一存储在区块链上的东西是一个指向存在于社交媒体网站服务器上的 JSON 文件的 URI,在那里他们可以对该文件做任何他们想做的事情,包括审查它。

为了简单起见,大多数 NFT 将tokenURI()函数实现为一个非常简单的函数,它只是将一个预定的 URL(如https://example.com/)与代币 ID(作为其唯一参数传递给函数)和一个扩展名连接起来(结果类似于https://example.com/1.json)。 这样,当一个 NFT 被铸造时,实际上在区块链上存储的数据非常少。 实际上,唯一存储的只是一个特定 ID 的代币被铸造。

真正不可审查的 NFT#

是否有可能拥有一个不可审查的 NFT? 是的。 那么一个所有数据确实存储在区块链上的 NFT 呢? 再次是的(有一些注意事项)。 让我们详细探讨每个问题。

不可审查的 NFT#

我们可以通过利用与加密世界相关的另一种流行技术 ——去中心化文件存储(如IPFSArweave)来创建一个不可审查的 NFT。 这两项服务都提供去中心化的,更重要的是,不可变的数据存储。 因此,理论上,一个社交媒体应用可以在创建时生成 NFT 的 JSON 元数据文件,将其存储在这些平台上,然后铸造 NFT 本身,并传入适当的ipfs://ar:// URI,然后将其存储在区块链上。

由于这些文件存储服务是不可变的,存储在特定 URI 上的数据永远无法被修改或删除(小注意事项:IPFS 确实会进行垃圾回收,未 “固定” 的文件有可能被删除;你可以通过自己冗余地固定特定 NFT URI 来确保它保持活跃;更多信息请参见IPFS 文档)。

为什么这种方法没有更广泛使用? 最有可能的原因是需要将所有生成的 JSON 文件上传到 IPFS 或 Arweave,并将适当的链接发送到 NFT 合约并存储该链接的复杂性略有增加。 这使得铸造交易更复杂,并会增加燃气费用。

将所有数据存储在区块链上#

我们可以通过将数据传递给 NFT 合约上的铸造函数来将所有 NFT 数据存储在区块链上,包括描述、图像 URI(如果你使用去中心化文件存储来存储它,额外加分,如上所述)和所有属性。 然后,这些都必须在智能合约中存储在区块链上。 一旦调用tokenURI()函数,你实际上可以生成一个Base64编码的data: URI,由这些组件组成。 像 OpenSea 这样的网站可以读取和处理这些 URI,并将数据正确显示。

一个很好的例子是 Uniswap V3 Positions NFT 合约,它铸造代表持有者在特定池中的位置的 NFT。 所有数据都驻留在区块链上,tokenURI()函数返回的内容看起来像:

data:application/json;base64,eyJuYW1lIjoiVW5pc3dhcCAtIDElIC0gTUFSRS9XRVRIIC0gMC4wMDEwMDgxPD45OT...

我缩短了 URI,因为它大约有 13,000 个字符长! 这是因为不仅描述、属性等存储在区块链上,而且 NFT 合约还生成一个用于表示代币的动画 SVG 图像。 然后它将这个 SVG 进行 Base64 编码,并将其用作 JSON 文件中的一个字段,然后再次进行 Base64 编码!

以下是解码后的 Uniswap V3 URI 示例:

{
	"name": "Uniswap - 1% - MARE/WETH - 0.0010081<>991430000000000000",
	"description": "这个NFT代表在Uniswap V3 MARE-WETH池中的流动性位置。 这个NFT的拥有者可以修改或赎回该位置。\n\n池地址:0x94adf857e6f0bdad207c9934a27a632b5cf29ca6\nMARE地址:0xc5a1973e1f736e2ad991573f3649f4f4a44c3028\nWETH地址:0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\n费用等级:1%\n代币ID:160857\n\n⚠️免责声明:在评估这个NFT时,尽职调查是至关重要的。 确保代币地址与预期的代币匹配,因为代币符号可能会被模仿。",
	"image": "data:image/svg+xml;base64,PHN2ZyB3aWR..."
}

我再次缩短了image字段中的 URI,因为它几乎有 10,000 个字符长。

为什么更多的平台不使用这种方法? 这很明显,因为在区块链上存储所有数据的成本将变得过于昂贵,尤其是在像以太坊这样的网络上。

大注意事项#

仅仅因为一个 NFT 合约将其所有元数据存储在 IPFS 或区块链上,并不一定意味着它是不可审查的! 代币合约可能具有合约所有者可以调用的函数,这些函数将修改存储在区块链上的代币 URI 或元数据。 你应该始终仔细检查合约或找到可以信任的来源。 并且永远不要信任未发布其源代码的合约!

如何判断 NFT 是否不可审查#

你如何判断一个 NFT 是否不可审查? 对于 ERC-721 NFT 来说,这相对简单。 只需访问 NFT 在 OpenSea 上的页面,向下滚动并展开详细信息部分,记下你感兴趣的特定代币 ID,然后点击合约链接。

OpenSea 详细信息示例

这将打开区块链浏览器中的合约。 在屏幕中间位置,点击合约,然后点击读取合约。

Etherscan 读取合约示例

最后,向下滚动直到找到tokenURI()函数,点击它,然后输入你上面记下的代币 ID。 点击查询按钮,它应该返回你的代币 URI。

Etherscan tokenURI 查询示例

如果你的代币 URI 以data:ipfs://ipns://ar://开头,那么你的代币就是真正不可审查的(可能,见注意事项)。 如果它以data:开头,那么你的代币实际上是存储在区块链上的!

结尾#

我希望这有助于提高你对 NFT 是什么以及它们如何被审查的理解。 我有一个想法,创建几个关于这个主题的帖子,实际上编写一个可审查的 NFT 合约,并向你展示它如何被审查,甚至可能允许人们铸造他们的可审查 NFT 的副本,然后他们可以观看我如何审查它。 然后我可以制作一个不可审查的版本。

在这里留下评论,让我知道你对这篇小文章的看法或是否有任何问题。 你可以在AuthencityMastodon上联系我。

编辑: 这篇文章的早期版本提到 Authencity 没有将所有帖子的数据显示在区块链上。 Authencity 的 Marc 联系了我,并指出getTokenData()非标准函数,实际上似乎证明该合约将所有帖子的数据显示在区块链上。 我为错过这一点而道歉,并撤回该声明;文章已适当编辑。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。