如何使用Solidity創建鏈上NFT ?

大多數NFT項目都是在鏈下存儲圖像和元數據文件。

下 NFT

這就引出了一個問題,不是所有的NFT 都在鏈上嗎?任何在以太坊區塊鏈的NFT工作過的人都可以告訴你,鏈上數據存儲確實存在限制;因為這是非常昂貴的,而且大多數NFT項目都是在鏈下存儲圖像和元數據文件。通常我們看到的存儲在“鏈上”的唯一數據是元數據(我們的tokenURI)的不可變哈希——描述這個哈希的最簡單的方法是鏈接到我們實際的NFT,這裡的區別是哈希依賴於創建它的數據;改變源,哈希不再有效,因此它是不可變的。任何人都可以運行一個IPFS節點就像任何人都可以運行一個區塊鏈節點礦工或共識。

現在,我們可能對Loot這樣的“鏈上”項目很熟悉,這個項目是如何完成的? 我們真的能在鏈上存儲合適的視覺媒體嗎?

答案是肯定的,但它需要一些東西,即Base64編碼和SVG圖像類型。兩者都允許我們處理文本數據,而不是像PNG 或JPEG 這樣典型的內存“重”視覺數據。這意味著我們需要做兩件事:

  • Base64編碼我們的json元數據

  • 以SVG 格式編碼圖像渲染的“指令”

幸運的是,瀏覽器可以理解這兩種格式,基於瀏覽器的市場(如OpenSea)可以以與IPFS 存儲哈希的鏈接相同的方式呈現我們的NFT,然而,瀏覽器不是“獲取和緩存”圖像,而是為我們呈現圖像。

Base64編碼

實現鏈上元數據存儲並避免對任何工具(如IPFS)的需求的一種方法是對其進行base64編碼,並將其直接存儲在我們的NFT代幣數據中。在我們的例子中,tokenURI會以編碼格式返回實際的元數據:這不再是一個“鏈接”,而是元數據本身。

正如我所說的,我們將利用來自GitHub 的現有Base64.sol 庫。可以從github導入或簡單地克隆/複製代碼,並從粘貼此文件的同一目錄導入此文件。

關於Base64的編碼需要注意的是,編碼並不是一種數據壓縮形式,因此我們並沒有減少數據的大小,我們只是將其存儲在瀏覽器可以解碼的格式中。我們的元數據不是非常大,這就是我們的NFT圖像的情況。下面是一個例子:

在我們的示例代碼中,我們利用了函數’ BuildMetaData ‘,它接受一個tokenId(我們的NFT的ID),並返回一個base64編碼的json文本字符串,其中包含OpenSea 使用其名稱、描述、屬性呈現我們的NFT 所需的一切,非常重要的是,我們的形象。它還利用了我將在下面解釋的BuildImage 函數。

以下是我們的元數據示例:

那麼我們的image值是怎麼回事?我們的image值是1 – SVG和2 – SVG也是Base64編碼的;這意味著我們的SVG文本已經像json(文本)數據一樣被進行了編碼。

可以注意到,我們在編碼後的json中添加了一些內容,如下所示:

“application / json數據:;base64。”

這只是簡單地描述了數據是什麼,以及接收方或接收方瀏覽器如何對其進行相應的解碼。

ABI編碼

我們還在整個項目代碼中執行ABI編碼。在我們的例子中,ABI編碼或應用程序二進制接口只允許我們連接多行文本。 “This”,“is”,“my”,“code”如果沒有被編碼成單個字符串,就會導致錯誤。

SVG文件

什麼是SVG,為什麼它對我們很重要?

SVG或可伸縮的矢量圖形本質上允許我們以xml類型格式或文本形式存儲圖像;可以存儲在鏈上的文本。我們不是存儲大的圖像數據,而是用文本描述我們想要的圖像,並以我們的瀏覽器和OpenSea可以為我們呈現的方式對其進行編碼。我們可以設置圖像的各種特徵,包括大小,顏色,甚至可以為我們呈現的文本。

可以這樣想,如果我想給你發送一張簡單的圖片,我可以通過電子郵件或文本發送一張高分辨率的PNG圖像,或者你可以簡單地用幾個詞描述它,然後讓你的收件人為你呈現或生成它。如果數據傳輸是昂貴的,我們可以做一個“權衡”,通過增加接收者的成本(作為努力)來降低成本。

下面的文本描述可能要傳輸的數據密集程度要低得多,然後是高清PNG。只要收件人有工具可以輕鬆地呈現這一點,我們就大大降低了數據存儲或傳輸方面的成本:

“500×500大小的藍色背景,白色文字寫著’Hello World’”

我們的示例代碼在函數BuildImage中描述SVG的參數。

有很多很棒的生成SVG的在線工具和模板,我鼓勵你找到一些有助於將自己的想法變為SVG 的工具。

確保使用百分比進行佈局,因為應用開發的“硬編碼”值可能會在我們增加或減少渲染的屏幕尺寸時帶來問題。 1000像素作為文本的起始點是可以的,直到我們將設備的屏幕尺寸減小到1000×1000以下,在這種情況下,我們最好將其設置為80%。

我們的SVG,在ABI和Base64編碼之前:

我們將再次注意到我們已附加有關數據的詳細信息:

“數據:圖像/svg+xml;base64”

用戶輸入

我們的智能合約更有趣的功能之一是用戶能夠通過將一些文本數據輸入到mint 函數中來為最終的NFT 做出貢獻。這個用戶輸入被保存為“內存字符串”,然後通過BuildImage函數動態地添加到我們的SVG數據中。

我限制了文本輸入的大小並為此限制添加了一個錯誤,但用戶可以完全了解他們可能添加的內容。這是不可改變的,永遠存在於區塊鏈。

我們的mint函數通過在函數上添加一個字符串期望來實現這個功能:

NFT和智能合約互動

如果你正在使用Remix之類的工具,可以簡單地修改提供的代碼,將其上傳到Remix,編譯並部署以進行測試。

由於我們的mint函數需要用戶輸入字符串數據,能夠添加文本,然後利用我們的tokenURI函數來查看產生的內容,這是相同的tokenURI函數,像OpenSea這樣的市場將利用來檢索或解析我們的NFT數據和圖像。

那麼我們該怎麼做呢?要在您的瀏覽器中呈現它,然後需要復制“字符串”之後的所有內容(我們不需要這個)並將其粘貼到我們的瀏覽器中。將其粘貼到我們的瀏覽器中的結果將如下所示:

此外,我們可以通過複製“image”值來查看我們的圖像,我們想要復制的部分在這裡突出顯示:

結果如下所示:

圖像數據粘貼到我們的本地瀏覽器中圖像數據粘貼到我們的本地瀏覽器中

我們的NFT

這樣,我們就創建了一個智能合約,允許用戶在生成文本時輸入文本,生成包含用戶輸入的SVG數據,將其編碼為Base64,並將其添加到同樣是Base64編碼的元數據中。其結果是,鏈上NFT將在OpenSea等市場中呈現如下內容:

來源:https://medium.com/coinmonks/how-to-create-on-chain-nfts-with-solidity-1e20ff9dd87e

展開全文打開碳鏈價值APP 查看更多精彩資訊

Total
0
Shares
Related Posts