我們需要將NFT 轉移到第2 層(L2)生態系統以降低費用。然而,這樣正確做到這一點需要良好的跨Rollup 可移植性標準,從而生態系統可以避免被鎖定在一個特定的L2 中。 ——Vitalik Buterin
NFT 生態系統正在迅速發展,已經成為以太坊鏈gas 消耗的重要組成部分。 NFT 生態系統的年輕化和相對缺乏根基,以及由於NFT 的很大一部分的非金融性質而更需要避免高額費用,這也使得NFT 成為轉移到第2 層(Layer2)網絡的主要目標。然而,這就提出瞭如何將NFT 遷移到Layer2 的問題。
一個簡單的提案是:在社區內協調將NFT 遷移到單個Rollup 平台(例如Arbitrum,因為它目前可用於一般合約部署),但這存在一些重要的缺點:
-
所有現有的支持EVM 的主要Rollup 平台都有後門、集中排序或其他實驗性功能,將整個生態系統交給單個Rollup 是有風險的,而Rollup 將如何超越這些功能存在不確定性。
-
NFT 生態系統可能會變得太大,以至於單個Rollup 無法安全處理
-
NFT 生態系統的任何部分,甚至整個NFT 生態系統,都不是封閉的世界;他們將需要與以太坊生態系統的其他部分進行互操作
這篇文章提出了一種關於如何使NFT 跨Rollup 友好的提案,允許NFT 移動到整個Layer2 生態系統。
提議的解決方案 1
NFT 將首先在一個Rollup (或基礎鏈)中註冊。通過創建一個封裝NFT,NFT 可以在其他Rollup (或基礎鏈)之間跳轉。
封裝NFT 的過程如下:
-
在Rollup A 上,將NFT (我們稱之為X)發送到封裝管理器合約,指定(i) 目的地Rollup 和(ii) 初始所有者。密碼箱合約在存儲中保存一條記錄,為X 分配一個新的序列號R,並保存目標Rollup (我們稱之為B)和目標Rollup 的初始所有者(我們稱這個賬戶O1)
-
在Rollup B 上,任何人都可以使用Rollup B 上的封裝管理器合約創建封裝NFT。創建一個封裝NFT 需要指定源Rollup 和序列號。創建X 的一個「有效」封裝NFT 只能由指定的所有者並通過聲明(R, A) 作為序列號和源Rollup 來完成。請注意,可能會創建一個無指向內容的無效封裝NFT;Rollup B 不知道什麼是有效和無效。封裝管理器合約存儲(序列號、源Rollup、初始所有者)元組(tuples)並防止使用同一個元組創建多個NFT。
-
要從密碼箱中提取NFT,Rollup B 上的封裝-X 的當前所有者必須將其發送回封裝管理器,後者會發出收據,說明「序列號為R、源匯總A 和初始所有者O1 的NFT 剛剛接觸封裝,帶有想要的新所有者O2」。
-
密碼箱合約可以在收到匯總B 上的收據的證明時將X 交給O2,並根據自己存儲的信息檢查序列號、源Rollup 和初始所有者,並驗證它是否通過。
請注意,提款會有一個時間延遲,因為Optimistic Rollup 狀態根需要大約1 週的時間延遲才能最終確定,以便驗證收據。到目前為止,更快地進行多跳的唯一方法是進行多層封裝。
為了讓用戶驗證封裝-X 是否合法,他們需要自己驗證Rollup B 上的狀態和Rollup A 上的收據。
擴展:添加跨Rollup 傳輸
在匯總B 上,wrapped-X 的所有者可以將其發送給包裝管理器,並附上發出不同收據的指令:「序列號為R、源Rollup A 和初始所有者O1 的NFT 剛剛移至Rollup C,與想要的新所有者O2」。
在Rollup C 上,任何人都可以通過指定原始源Rollup (在此示例中為Rollup A)、序列號和初始所有者來製作封裝-X 對象,並且Rollup C 上的此封裝-X 可以自由交易。但是,為了能夠撤回封裝-X,需要將Rollup B 的收據發送到Rollup A。
實際發生的事情是,當NFT 從一個Rollup 移動到另一個Rollup 時,轉移鏈留下了一個收據鏈,該收據鏈中的每一個收據都被鏡像到Rollup A 並在某個時間點按順序處理。未來,當其他Rollup 的狀態最終確定時(這可以在短期內通過Kate 承諾進行空間優化,從長遠來看,可以通過ZK-SNARK 證明整個收據鏈)。
為了讓用戶驗證封裝的X 是合法的,他們需要驗證反映跨Rollup 轉移的所有Rollup 上的整個收據鏈(或者至少,自上一個收據以來已經鏡像到Rollup 的收據鏈一種)。
此外請注意,該協議可以簡化:「提款」只是一個跨Rollup 轉移Rollup A,如果認識到Rollup A 發布的特定序列號現在在Rollup A 上,那麼該封裝的合約可以直接兌換。
擴展2:基礎鏈上的gas 優化發行
所有NFT 都可以以這樣的方式發行,即它們由以太坊基礎鏈上的密碼箱合約「擁有」。為了使這種gas 高效,密碼箱合約將獲得生成一整套序列號並將它們傳輸到Rollup 的功能。實際上,所有NFT 都是預先創建的,但尚未分配給其中任何一個「意義」(想想:有2**256 個尚未分化的「幹細胞」NFT),並且它們被批量轉移到Rollup。
「發行」的過程現在變成了賦予意義的過程。這可以通過在收據中傳遞「含義哈希」來完成,就像傳遞所有者的方式一樣:如果NFT 沒有意義(它是一個「幹細胞」),所有者可以為其分配一個含義,轉動它變成了一個「差異化」的NFT。基礎鏈只有在驗證收據鏈後才知道NFT 的含義,直到分配含義為止(實際上,收據驗證必須是ZK-SNARK 的才能使其可行)。
這允許所有NFT 都在基礎鏈中「紮根」,而不是Rollup。這對於處理Rollup 中斷或以其他方式變得不可行以及應用需要永久遷移到其他域的情況很有用。