關於以太坊ERC-721 兩個值得注意的小細節

201次閱讀

基礎知識

ERC-721 是一個標準。它定義了一套代碼規則,用於在以太坊區塊鏈上記錄與 NFT 有關的資訊。儘管 ERC-721 不是強制性的,但它被廣泛接受為 NFT 項目的標配。

ERC-721 的全稱是 Ethereum Request for Comment-721(以太坊徵求意見稿第 721 號)。ERC-721 源自第 721 號 Ethereum Improvement Proposal(以太坊改進提案,EIP)。EIP 經過審查和最終確定後,就會成為 ERC。

EIP-721 於 2017 年 9 月由 Dieter Shirley 首先提出。後來 Shirley 根據 EIP-721 的原始版本在 2017 年末共同開發了 CryptoKitties,引爆了當時的以太坊社區。EIP-721 於 2018 年 1 月 24 日由 William Entriken、Dieter Shirley、Jacob Evans 和 Nastassia Sachs 正式提交。2018 年 6 月 21 日,EIP-721 被接受為最終版本,成為 ERC-721。

ERC-721 為任何 NFT 指定了兩個標識符,合約地址和 token ID。它們的結合使得 NFT 變得真正的獨一無二。例如,只有一個 Bored Ape Yacht Club(合約)#3749(token ID)。

雖然 ERC-721 標準化了許多東西,但它的設計產生了兩個問題,分別是所有權和 metadata。

 

 

所有權

ERC-721 允許大家在 NFT 智能合約中登記 NFT 的所有權。採用這種登記方式導致你購買的 NFT 不會出現在你的名下。相反,是你的名字出現在你購買的 NFT 下面。換句話說,不是你的 NFT 屬於你,而是你屬於你的 NFT。

當鑄造 (創建)NFT 時,一系列資訊以 ERC-721 合約的名義在以太坊區塊鏈上被記錄,包括合約地址、token ID、所有者地址等。如果 NFT 從一個地址被轉移到另一個地址,NFT 並沒有從一個錢包轉移到另一個錢包,真正發生的只有 ERC-721 合約中的所有者地址被更新而已。

這意味著某個特定地址的 NFT 餘額存儲在各種 ERC-721 合約中。如果我想知道你擁有多少只無聊猿,我需要挨個檢查那 10,000 只無聊猿的鏈上記錄,並驗證每隻猴子的所有者地址是否與你的匹配。如果我還想看看你的 Azuki,我需要對 Azuki 合約重複相同的過程。ERC-20 合約事實上使用相同的機制。這就是為什麼你必須手動添加你剛剛購買的土狗的合約地址,這樣 Metamask 才可以進入該合約並獲得關於你到底買了多少的資訊。

如果以上聽起來太抽象,讓我舉一個生活中的例子。假設你在超市買菜,你會把蘋果、雞蛋和牛排都放進購物車裡。結完賬,你帶著一袋你買的所有東西離開。如果你在超市外等候的朋友想知道你買了什麼,他們只需看看購物袋裡都裝的啥就行了。這是現實世界中的方式。

在區塊鏈的世界裡,你買一樣東西的方式,是把你的名字寫在上面。如果你買了一個蘋果,你就在蘋果上寫下自己的名字,而不是帶著蘋果離開。如果你的朋友想知道你買了什麼,他們需要進到超市裡面,挨個瀏覽貨架上的每一件商品,檢查上面是否寫著你的名字。還記得嗎,你的蘋果不屬於你,相反,你屬於你的蘋果。

如果我們想找出一個特定地址的 NFT 餘額,我們需要查看現存的每一份 ERC-721 合約。這對於像 MetaMask 這樣的錢包應用來說是不現實的。因此,MetaMask 依賴中心化的數據提供商來獲取此類資訊。

現在,MetaMask 通過調用 OpenSea 的 API 來顯示你的 NFT(同樣,MetaMask 通過調用 Infura 的 API 來顯示你的 ERC-20 餘額)。這就是為什麼一些 NFT 在購買後需要幾個小時才能出現在你的錢包裡,而不是立刻。如果 OpenSea 從其網站上刪除了某個 NFT,它也會從其 API 中刪除它。因此,這個 NFT 將從你的 MetaMask 錢包中消失,即便那個 NFT 合約中仍然顯示你是其所有者。在某種程度上,OpenSea 通過他們提供的 API 規定了誰擁有什麼 NFT。儘管存儲在區塊鏈上的資訊不能被更改,但當這些資訊被檢索和呈現時可能會被扭曲。具有諷刺意味的是,構建區塊鏈的初衷是為了消除第三方風險。但是,為了保證用戶體驗,中心化的第三方仍然在人們與區塊鏈交互的過程中發揮著不可或缺的作用。而這在可預見的未來不太可能改變。

ERC-721 的設計從根本上限制了一個非託管錢包正確顯示一個人擁有的所有 NFT。如果一個 NFT 從你的錢包裡消失,不要驚慌。你多半沒有丟失它,只是 OpenSea 決定你不應該擁有它。

Metadata

ERC-721 允許 NFT 的相關數據存儲在鏈下並且可以被修改。這帶來兩個方面的風險。首先,鏈下存儲設施可能變得無法訪問。其次,Metadata 可以在沒有所有者許可的情況下被更改。

當談到 NFT 時,大多數人會想到圖像、音樂、文章等。但是像圖像這樣的數據不能直接存儲在鏈上,因為它們佔用了太多的空間,存儲它們太貴了。這樣的 NFT 數據通常存儲在鏈下,然後將指向該數據的鏈接轉換為一種被稱為 JSON(JavaScript Object Notation) 的格式。事實上,不僅是指向圖像的鏈接,NFT 名稱、描述以及屬性都是 JSON 文件的一部分,也被稱為 NFT 的 metadata。

ERC-721 沒有規定 JSON 文件的格式細節。不過,大多數 NFT 項目都使用 OpenSea 推薦的格式。下面展示了上述 NFT 示例的 JSON 文件內容。

然而,即使是 JSON 文件也太大了,無法存儲在區塊鏈上。實際上,NFT 中只存儲一個指向其 JSON 文件的鏈接。

因此,要上傳一個 NFT 的圖像,需要經過四個步驟:

上傳圖像到網上並生成一個鏈接。

創建一個包含該鏈接以及其他相關資訊的 JSON 文件。

上傳 JSON 文件並生成另一個鏈接。

通過 ERC-721 合約中的 URI 將 NFT 指向第二個鏈接。

ERC-721 允許將 NFT 與 一個特定 URI 相關聯,但這個 URI 是可變的。也就是說,它可以在必要時被更改。你的激光眼黃金猴可能隨時變成另一個完全不一樣的東西,可能是因為 Yuga Labs 的存儲服務器壞了,抑或是因為 Yuga Labs 故意更改了它。ERC-721 標準中沒有規定一個 NFT 的圖像應該是什麼樣子,也沒有方法允許 NFT 所有者確認 NFT 指向的圖像是否是正確的圖像。

大多數 NFT 項目都在 IPFS 上存儲圖像。IPFS 有一個很特別的功能,它提供的鏈接地址是與上傳的內容錨定的。地址與內容直接相關,如果內容髮生變化,地址也會發生變化。另外,OpenSea 有一個凍結 metadata 的功能。被凍結後的 NFT 的 metadata 始終保持不變。但是,這兩項功能並不能幫助一個 NFT 保持不變。如果一個 NFT 項目真的修改了上傳到 IPFS 的 jpeg,那麼,這個 jpeg 的鏈接便會隨之改變。舊鏈接不再有效,凍結 NFT 的 metadata 只會導致這個 NFT 無法正常顯示修改後的 jpeg。而如果一個 NFT 的圖像根本顯示不了,那麼持有它的意義也不大了。

如果 metadata 沒有被凍結,正如現在市面上的絕大多數 NFT 項目那樣,而 ERC-721 智能合約的所有者想要修改其中 metadata 的部分,單個 NFT 的所有者對此無能為力。

寫在最後

當市場再次活躍時,我們將在周報中繼續討論交易數據和熱點事件。在那之前,我希望這篇文章能幫助大家更好地理解 ERC-721 背後的小細節。

當你購買 NFT 時,你只是在將你的名字寫入以太坊分佈式賬冊上的某一行。如果不依賴中心化的服務提供商,這一行將很難被訪問。同時,存儲在該行上的其他資訊可能會在沒有你同意的情況下被更改。你的 NFT 並不像鑽石一樣恆久遠,一顆永流傳。

 

1
以太全書
版權聲明:本站原創文章,由 以太全書 2022-10-13發表,共計3082字。
轉載說明:除特殊說明外,本站文章如需轉載請註明出處。