最近出現了許多新的 Web3 社交媒體網站,其中大多數承諾(或暗示承諾)具有抗審查或完全無法審查的特性。事實是,這些網絡大多實際上是受到審查的,因為它們實施 NFT 代幣標準的方式。
什麼是 NFT?#
一個 非同質化代幣 (NFT) 只是以太坊虛擬機上的一個合約(例如以太坊、Polygon、Optimism 等),它實現了(最常見的)ERC-721 或 ERC-1155 標準。這些文檔描述了必須由合約實施的最低規範,以被視為 NFT。在本文的其餘部分,當我討論 NFT 時,我將談論 ERC-721 標準,這是較舊且更廣泛實施的 NFT 標準。
NFT 最獨特的三個屬性使其與同質化代幣區別開來,即每個 NFT 由唯一的數字 ID 表示,NFT 沒有分數部分(你不能擁有一半的 NFT),每個代幣合約實現了 tokenURI()
函數。
什麼是代幣 URI?#
一個 統一資源標識符 (URI) 是 一組唯一的字符序列,用於識別由網絡技術使用的邏輯或物理資源。
我們最常想到的是 http://
或 https://
的 URL(這是一種特定類型的 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()
函數返回的數據。記住 description
和 image
字段嗎?這些實際上是你的社交媒體帖子的內容,而唯一存儲在區塊鏈上的東西是一個指向存在於社交媒體網站伺服器上的 JSON 文件的 URI,在那裡他們可以對該文件做任何他們想做的事情,包括審查它。
為了簡化,大多數 NFT 實現的 tokenURI()
函數是一個非常簡單的函數,它只是將預定的 URL(如 https://example.com/
)與代幣 ID(作為唯一參數傳遞給函數)和擴展名串聯在一起(結果類似於 https://example.com/1.json
)。這樣,當 NFT 被鑄造時,實際上在區塊鏈上存儲的數據非常少。實際上,唯一存儲的只是某個特定 ID 的代幣被鑄造。
真正無法審查的 NFT#
有可能擁有無法審查的 NFT 嗎?是的。那麼,是否可以擁有所有數據真正存儲在區塊鏈上的 NFT?再一次是的(有一些警告)。讓我們詳細探討每個問題。
無法審查的 NFT#
我們可以通過利用與加密世界相關的另一種流行技術,即 去中心化文件存儲,如 IPFS 或 Arweave,來創建一個無法審查的 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 位置 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 來說相當簡單。只需訪問 OpenSea 上 NFT 的頁面,向下滾動並展開詳細信息部分,記下你感興趣的特定代幣 ID,然後點擊合約鏈接。
這將在區塊鏈瀏覽器中打開合約。在屏幕中間位置,點擊合約,然後點擊讀取合約。
最後,向下滾動直到找到 tokenURI()
函數,點擊它,然後輸入你上面記下的代幣 ID。點擊查詢按鈕,它應該返回你的代幣的 URI。
如果你的代幣 URI 以 data:
、ipfs://
、ipns://
或 ar://
開頭,那麼你的代幣就是真正無法審查的(可能,見 警告 上述)。如果它以 data:
開頭,那麼你的代幣實際上是存儲在區塊鏈上的!
結語#
我希望這有助於提高你對 NFT 是什麼以及它們如何被審查的理解。我有一個想法,想創建幾篇關於這個主題的帖子,實際上編寫一個可審查的 NFT 合約,並向你展示它如何被審查,也許甚至允許人們鑄造他們的可審查 NFT 的副本,然後他們可以觀看我如何審查它。然後我可以製作一個無法審查的版本。
在這裡留下評論,讓我知道你對這篇小文章的看法或如果你有任何問題。你可以在 Authencity 或 Mastodon 上聯繫我。
編輯過: 這篇文章的先前版本提到 Authencity 沒有將所有帖子的數據存儲在區塊鏈上。來自 Authencity 的 Marc 聯繫我並指出 getTokenData()
非標準函數,事實上似乎證明該合約將所有帖子的數據存儲在區塊鏈上。我為錯過這一點而道歉,並撤回該聲明;文章已適當編輯。