知道創宇區塊鏈安全實驗室|NFT:鏈中自有黃金屋

買賣虛擬貨幣

緣起於“謎戀貓”遊戲的 nft,經過佳士得拍賣事件的發酵,引來了越來越多的目光和討論,但外界的認知大都停留在應用層面。知道創宇區塊鏈安全實驗室 透過具象化的概念分解和實踐演示,帶你多角度地進入 nft 的世界。


前言


2021 年 3 月 11 日,佳士得歷史上首次拍賣以 nft 形式展現的純數字藝術品,這幅底價 100 美元的作品最終以 6934.6 萬美元成交,一舉成為在世藝術家成交作品第三高價。


這一事件,將越來越多的目光吸引向 nft 的世界。對於區塊鏈行業外的人士而言,nft 還是一個新鮮事物。但實際上,nft 很早就已經出現了——即在 2017 年末以太坊上興起的謎戀貓遊戲。“謎戀貓是世界首款區塊鏈遊戲。‘區塊鏈’是支援類似比特幣這樣的加密貨幣的運作技術基礎。儘管謎戀貓不是數字貨幣,但它也能提供同樣的安全保障:每一隻謎戀貓都是獨一無二的,而且 100% 歸您所有。它無法被複制、拿走、或銷燬。”當時這款遊戲推出後便風靡一時,一度導致了以太坊網路的堵塞。


不過相信大多數人還是對 nft 停留在應用上的認知,今天我們來嘗試從新的角度來認識它。


什麼是 nft


nft 是 non-fungible token 的縮寫,中文稱為「非同質化代幣」,通常是指開發者在以太坊平臺上根據 erc721 標準 / 協議所發行的代幣。


既然 nft 被稱作「非同質化代幣」,那麼相應的肯定有「同質化代幣」,下圖是二者一個形象的舉例。



同質化代幣

同質化代幣的典型代表就是以 erc20 標準 / 協議發行的 token。在 erc20 標準 / 協議我們中可以知道,erc20 的 token 是指定小數位數的,也就是 token 可以任意分割,token 與 token 之間是等價的。簡單來說同質化代幣就是一種能夠相互替換、具有統一性、可被拆分的代幣。就像美元之間可以進行交換,即使序號不同,價值卻保持一致。


非同質化代幣

非同質化代幣的典型代表就是以 erc721 標準 / 協議發行的 token。而在 erc721 標準 / 協議 中則定義的是一種不可分割的 token ,每個 token 都是獨一無二的,我們可以追蹤每個 token 的轉移和其價值的變動的。可以認識到非同質化代幣就是由於包含了記錄在其智慧合約中的識別資訊使得每種代幣都具有獨一無二的特性,因此不能被另一種代幣直接取代。


nft 鑄造


說了 nft 的獨特,那我們再來談談它是怎麼被鑄造的,以及基於什麼邏輯實現它的獨一無二。


以下非同質化代幣的鑄造分析,原始程式碼參考以太坊 erc721 提案。


首先非同質化代幣的鑄造會執行
_safemint 函式,該函式存在兩個引數,他們分別的作用是:

  • to:新鑄的代幣接受地址
  • tokenid:新鑄代幣的 id 序列

可以看到接下來呼叫三引數同名 _safemint 函式,

最後呼叫 _mint 函式進行鑄幣:

就這樣一個獨一無二的 nft 被鑄造出來了。總體過程如下:

合約中使用 _safemint 函式呼叫鑄幣函式並檢查函式的 erc721 函式介面合法性,該函式在 erc721 中有所體現,程式碼如下:

在 _mint 函式中首先檢查了地址是否是 0 地址,還有 tokenid 是否已存在。該 tokenid 在 erc721 標準中生成規則是一個不可互換的通證。檢測透過後為 to 地址鑄幣 (相應的 tokenid ), 同時記錄餘額與該 nft 藝術品的歸屬者。


nft 鑄造示例


看到這,相信你也瞭解到什麼是 nft 了,來讓我們透過部署一個 erc721 智慧合約來進行鑄造演示。

需要用到的工具有 remix,metamask 和 ipfs。


將圖片上傳到 ipfs

我選擇製成 nft 的是一張可愛的貓貓圖片。

  1. 開啟終端初始化 ipfs repo;
  2. 再開啟一個終端開啟 daemon 服務;
  3. 在第一個終端中輸入以下命令將圖片加入到 ipfs 中,並複製下生成的 hash;
  4. 向 ipfs 新增 josn 檔案,同樣複製下生成的 hash。


合約程式碼

我們直接透過模擬合約在 remix 上測試。

nft 模擬測試合約如下,為了方便和安全,我們使用了 0xcert/ethereum-erc721 合約來建立我們的 nft 合約。



鑄造 nft

使用 injected web3 進行部署。編譯合約前一定要在 metamask 上選擇測試網路,我選擇的是 kovan 測試網路。

現在進入 remix 中的 deployed contracts 部分,展開部署的合約。你會看到一堆函式 / 方法。展開 mint 函式並新增以下引數 :

  • 在_to 中新增你的 kovan 地址。
  • 在 tokenidpre 中輸入任何數字值。
  • 在_uri 欄位中,新增獲得的 json 檔案的 uri。
  • 點選交易,並從 metamask 確認交易。

接下來在我們的錢包就可以看到一個名叫 mmn 的 nft 已經生成了。


拓展 &nft 隨機數安全


在仔細閱讀了測試合約程式碼後,大家會發現,我並沒有直接使用傳參 tokenidpre 作為代幣的標識,而是將它作為依據由演算法生成的隨機數來作為代幣標識。為什麼要這樣呢?不知道大家有沒有玩過盲盒——指消費者不能提前得知具體產品款式的玩具盒子,具有隨機屬性。很明顯 nft 同樣適用於盲盒屬性,只要適當的使用隨機數就能有各種各樣的 nft 盲盒玩法。


現實玩法如在 blindboxes dapp 中,創作者透過主智慧合約在 xdai 生成空的收藏品盒,創作者將 nft 存入 nft holder (dapp 部署在以太坊上的智慧合約);nft holder 將其狀態透過 amb 同步到 xdai 上的主智慧合約;創作者透過主智慧合約往收藏品盒中新增一個或多個 nft,之後可以選擇釋出。這些釋出的 nft 會透過 randomaura (基於 randao 鏈上隨機數生成器)引入隨機性,確保盲盒的隨機性。


但是盲盒也可能不 " 盲 ",因為盲盒的隨機性是由隨機數生成器生成的,一旦隨機數生成器被破解,如各類預言機被破解事件,足以提醒我們要使用安全的隨機數生成器。


以下讓我們來分析一些簡單的盲盒隨機化規則 , 談談其安全性:



首先我們可以看到該函式僅允許被個人地址呼叫,就可以杜絕駭客使用其它方法來呼叫該函式。


接著就是最關鍵的抽獎結果的生成,一共涉及兩個變數一個常量:

  • 變數 1:index 由呼叫該函式的個人決定
  • 變數 2:block.timestamp 由當前的區塊決定
  • 常量:total_role 總量 53 不會改變


這時問題就出現了,作為該函式的呼叫者一共能控制變數 index 和常量 total_role,那如果駭客能控制最後一個變數,是不是他就能操作抽獎結果?


而這並非不能辦到。因為鏈上的資料都是可以計算和預測的,甚至礦工還可以提前計算結果。而當駭客能預測 block.timestamp 值時,也就相當於他控制了該變數。


所以盲盒真的會不 " 盲 ",使用安全的隨機數極為重要。


總結


無論什麼時代都會有人追求獨一無二,數字化的世界裡同樣如此。nft 的出現既是對人們追求獨一無二慾望的滿足,也是數字化時代認證方式的開拓。相信在不斷完善的未來世界,nft 一定能發揮出舉足輕重的作用,但同時我們也不能對其安全掉以輕心。



知道創宇區塊鏈安全實驗室官網:www.knownseclab.com
知道創宇唯一指定存證平臺:www.attest.im
聯絡我們:[email protected]



知道創宇區塊鏈安全實驗室導航


微信公眾號
@ 創宇區塊鏈安全實驗室


微博
@ 知道創宇區塊鏈實驗室
https://weibo.com/blockchainlab


知乎
@ 知道創宇區塊鏈安全實驗室
https://www.zhihu.com/org/zhi-dao-chuang-yu-qu-kuai-lian-an-quan-shi-yan-shi


twitter
@ks_blockchain_
https://twitter.com/ks_blockchain



免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;