鏈下NFT
這就引出了一個問題,不是所有的NFT都在鏈上嗎?任何在以太坊區塊鏈的NFT工作過的人都可以告訴你,鏈上數據存儲確實存在限制;因為這是非常昂貴的,而且大多數NFT項目都是在鏈下存儲圖像和元數據文件。通常我們看到的存儲在“鏈上”的唯一數據是元數據(我們的tokenURI)的不可變哈希——描述這個哈希的最簡單的方法是鏈接到我們實際的NFT,這里的區別是哈希依賴于創建它的數據;改變源,哈希不再有效,因此它是不可變的。任何人都可以運行一個IPFS節點就像任何人都可以運行一個區塊鏈節點礦工或共識。
現在,我們可能對Loot這樣的“鏈上”項目很熟悉,這個項目是如何完成的?我們真的能在鏈上存儲合適的視覺媒體嗎?
答案是肯定的,但它需要一些東西,即Base64編碼和SVG圖像類型。兩者都允許我們處理文本數據,而不是像PNG或JPEG這樣典型的內存“重”視覺數據。這意味著我們需要做兩件事:
Base64編碼我們的json元數據
以SVG格式編碼圖像渲染的“指令”
幸運的是,瀏覽器可以理解這兩種格式,基于瀏覽器的市場可以以與IPFS存儲哈希的鏈接相同的方式呈現我們的NFT,然而,瀏覽器不是“獲取和緩存”圖像,而是為我們呈現圖像。
Base64編碼
實現鏈上元數據存儲并避免對任何工具(如IPFS)的需求的一種方法是對其進行base64編碼,并將其直接存儲在我們的NFT代幣數據中。在我們的例子中,tokenURI會以編碼格式返回實際的元數據:這不再是一個“鏈接”,而是元數據本身。
BAT上線FUBT五分鐘漲幅22%:據FUBT實時行情顯示,BAT今日上線FUBT,五分鐘漲幅22%,報0.19USDT,行情波動較大,請注意風險。
據了解,\"BAT(Basic Attention Token)是Javascript創始人,Mozilla和Firefox瀏覽器聯合創始人Brendan Eich創辦的一個用于在廣告商和用戶之間進行流通的數字資產,用于解決瀏覽器中的廣告展示和用戶激勵問題。[2020/5/12]
正如我所說的,我們將利用來自GitHub的現有Base64.sol庫。可以從github導入或簡單地克隆/復制代碼,并從粘貼此文件的同一目錄導入此文件。
關于Base64的編碼需要注意的是,編碼并不是一種數據壓縮形式,因此我們并沒有減少數據的大小,我們只是將其存儲在瀏覽器可以解碼的格式中。我們的元數據不是非常大,這就是我們的NFT圖像的情況。下面是一個例子:
在我們的示例代碼中,我們利用了函數'BuildMetaData',它接受一個tokenId(我們的NFT的ID),并返回一個base64編碼的json文本字符串,其中包含OpenSea使用其名稱、描述、屬性呈現我們的NFT所需的一切,非常重要的是,我們的形象。它還利用了我將在下面解釋的BuildImage函數。
以下是我們的元數據示例:
行情 | BSV過去五分鐘上漲近10%:據火幣行情數據顯示,BSV過去五分鐘上漲近10%,最高漲至130.7999美元,現報128美元,行情波動較大,請注意風險控制。[2020/1/10]
{?"name":"NFT1",?"description":"Thisisouron-chainNFT",?"image":"data:image/svgxml;base64,PHN2ZyB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCBpZD0ic3ZnXzExIiBoZWlnaHQ9IjYwMCIgd2lkdGg9IjUwMyIgeT0iMCIgeD0iMCIgZmlsbD0iaHNsKDI5Myw1MCUsMjUlKSIvPjx0ZXh0IGZvbnQtc2l6ZT0iMTgiIHk9IjEwJSIgeD0iNSUiIGZpbGw9ImhzbCg5MCwxMDAlLDgwJSkiPlNvbWUgVGV4dDwvdGV4dD48dGV4dCBmb250LXNpemU9IjE4IiB5PSIxNSUiIHg9IjUlIiBmaWxsPSJoc2woOTAsMTAwJSw4MCUpIj5Tb21lIFRleHQ8L3RleHQPHRleHQgZm9udC1zaXplPSIxOCIgeT0iMjAlIiB4PSI1JSIgZmlsbD0iaHNsKDkwLDEwMCUsODAlKSIU29tZSBUZXh0PC90ZXh0Pjx0ZXh0IGZvbnQtc2l6ZT0iMTgiIHk9IjEwJSIgeD0iODAlIiBmaWxsPSJoc2woOTAsMTAwJSw4MCUpIj5Ub2tlbjogMTwvdGV4dD48dGV4dCBmb250LXNpemU9IjE4IiB5PSI1MCUiIHg9IjUwJSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iaHNsKDkwLDEwMCUsODAlKSIdXNlclRleHQ8L3RleHQPC9zdmc",?"attributes":}
行情 | BTC五分鐘上漲約2.11%:據Huobi數據顯示,BTC五分鐘內快速拉升,由6023美元最高上漲至6150美元,最大漲幅約2.11%,當前Huobi報價為6133美元。[2018/8/14]
通常情況下,我們的“image”值是這樣的:
{"image":"ipfs://QmWwMDLz6hQKCqjYba5cSHdrNUvPvAdndtaWjdFpm52GYm/1.gif"
}
那么我們的image值是怎么回事?我們的image值是1-SVG和2-SVG也是Base64編碼的;這意味著我們的SVG文本已經像json(文本)數據一樣被進行了編碼。
可以注意到,我們在編碼后的json中添加了一些內容,如下所示:
“application/json數據:;base64。”
這只是簡單地描述了數據是什么,以及接收方或接收方瀏覽器如何對其進行相應的解碼。
ABI編碼
我們還在整個項目代碼中執行ABI編碼。在我們的例子中,ABI編碼或應用程序二進制接口只允許我們連接多行文本。“This”,“is”,“my”,“code”如果沒有被編碼成單個字符串,就會導致錯誤。
SVG文件
什么是SVG,為什么它對我們很重要?
BTC五分鐘內下跌1.01%:據huobiPro平臺數據,BTC五分鐘內下跌1.01%,下跌金額為75美元,目前收于7381.43美元,請密切關注行情走向,注意控制風險。[2018/5/27]
SVG或可伸縮的矢量圖形本質上允許我們以xml類型格式或文本形式存儲圖像;可以存儲在鏈上的文本。我們不是存儲大的圖像數據,而是用文本描述我們想要的圖像,并以我們的瀏覽器和OpenSea可以為我們呈現的方式對其進行編碼。我們可以設置圖像的各種特征,包括大小,顏色,甚至可以為我們呈現的文本。
可以這樣想,如果我想給你發送一張簡單的圖片,我可以通過電子郵件或文本發送一張高分辨率的PNG圖像,或者你可以簡單地用幾個詞描述它,然后讓你的收件人為你呈現或生成它。如果數據傳輸是昂貴的,我們可以做一個“權衡”,通過增加接收者的成本(作為努力)來降低成本。
下面的文本描述可能要傳輸的數據密集程度要低得多,然后是高清PNG。只要收件人有工具可以輕松地呈現這一點,我們就大大降低了數據存儲或傳輸方面的成本:
“500x500大小的藍色背景,白色文字寫著‘HelloWorld’”
我們的示例代碼在函數BuildImage中描述SVG的參數。
有很多很棒的生成SVG的在線工具和模板,我鼓勵你找到一些有助于將自己的想法變為SVG的工具。
BTC五分鐘內上漲1.07% 突破8800美元:據火幣Pro數據,BTC在五分鐘內上漲1.07%,目前收于8867美元,漲幅0.82%。[2018/5/15]
確保使用百分比進行布局,因為應用開發的“硬編碼”值可能會在我們增加或減少渲染的屏幕尺寸時帶來問題。1000像素作為文本的起始點是可以的,直到我們將設備的屏幕尺寸減小到1000x1000以下,在這種情況下,我們最好將其設置為80%。
我們的SVG,在ABI和Base64編碼之前:
'','','SomeText','SomeText','SomeText','Token:',_tokenId.toString(),"",'',currentWord.value,"",
""
我們將再次注意到我們已附加有關數據的詳細信息:
“data:image/svgxml;base64”
用戶輸入
我們的智能合約更有趣的功能之一是用戶能夠通過將一些文本數據輸入到mint函數中來為最終的NFT做出貢獻。這個用戶輸入被保存為“內存字符串”,然后通過BuildImage函數動態地添加到我們的SVG數據中。
我限制了文本輸入的大小并為此限制添加了一個錯誤,但用戶可以完全了解他們可能添加的內容。這是不可改變的,永遠存在于區塊鏈。
我們的mint函數通過在函數上添加一個字符串期望來實現這個功能:
functionmint(stringmemory_userText)publicpayable{??uint256supply=totalSupply();??bytesmemorystrBytes=bytes(_userText);??require(strBytes.length<=stringLimit,"Stringinputexceedslimit.");??require(exists(_userText)!=true,"Stringalreadyexists!");????WordmemorynewWord=Word(????string(??????abi.encodePacked(????????"NFT",????????uint256(supply1).toString()??????)????),????"Thisisouron-chainNFT",????randomNum(361,block.difficulty,supply).toString(),????randomNum(361,block.timestamp,supply).toString(),????_userText??);??if(msg.sender!=owner()){????require(msg.value>=0.005ether);??}??wordsToTokenId=newWord;//Addwordtomapping@tokenId
??_safeMint(msg.sender,supply1);
NFT和智能合約互動
如果你正在使用Remix之類的工具,可以簡單地修改提供的代碼,將其上傳到Remix,編譯并部署以進行測試。
由于我們的mint函數需要用戶輸入字符串數據,能夠添加文本,然后利用我們的tokenURI函數來查看產生的內容,這是相同的tokenURI函數,像OpenSea這樣的市場將利用來檢索或解析我們的NFT數據和圖像。
那么我們該怎么做呢?要在您的瀏覽器中呈現它,然后需要復制“字符串”之后的所有內容并將其粘貼到我們的瀏覽器中。將其粘貼到我們的瀏覽器中的結果將如下所示:
此外,我們可以通過復制“image”值來查看我們的圖像,我們想要復制的部分在這里突出顯示:
結果如下所示:
?????圖像數據粘貼到我們的本地瀏覽器中
我們的NFT
這樣,我們就創建了一個智能合約,允許用戶在生成文本時輸入文本,生成包含用戶輸入的SVG數據,將其編碼為Base64,并將其添加到同樣是Base64編碼的元數據中。其結果是,鏈上NFT將在OpenSea等市場中呈現如下內容:
原文鏈接
尊敬的用戶: 為了提升我們的服務質量,優化交易用戶體驗,ALPEX平臺將于北京時間2022年01月06日17:00-18:00進行停機更新維護.
1900/1/1 0:00:00尊敬的XT用戶: 由于XT系統升級,1MCANDYLAD將延遲上線,相關時間調整如下:充值:2022年1月3日19:00Waves創始人:將于明日開始回購XTN:7月5日消息.
1900/1/1 0:00:00親愛的BitMart用戶,Liquidus(LIQ)將于2022年1月5日17:00(香港時間)上線BitMart!為慶祝LIQ上線,我們向廣大交易用戶開放LIQ交易大賽活動—瓜分15.
1900/1/1 0:00:00推薦:PANews跨年派對開啟!參與瓜分2022新年紅包!更多有關加密世界2021年回顧,2022年展望請關注專題:回顧Crypto2021.
1900/1/1 0:00:00尊敬的用戶: HuobiGlobal將支持RAI(RAIFinance)品牌升級置換為SOFI.
1900/1/1 0:00:00Theyear2022isnearlyuponus.Gate.iowishesallofyouaHappyNewYear!TocelebratetheNewYear.
1900/1/1 0:00:00