來源 | ethresear.ch
作者 | Vitalik Buterin
NFT 生態在迅速增長,并且構成了以太坊鏈上 gas 消耗的重要部分,NFT 生態系統仍處于年輕態并相對缺乏根基,并且由于 NFT 領域很大一部分屬于非金融性質,因此更需要避免高額費用,這使得轉移到 layer 2 成為主要目標。然而, 這就拋出了如何轉移到 layer 2 的問題。
一個簡單的提議是通過社會性協調轉移到一個特定的 rollup 平臺 (例如 Arbitrum,因為目前已經支持通用智能合約部署),但這樣做也有幾處劣勢:
- 所有目前支持 EVM 的主要 rollup 平臺都有后門、中心化排序或其他輔助措施,將整個生態系統轉移到單個 rollup 是有風險的,而 rollup 將如何升級這些功能還存在不確定性;
- NFT 生態系統最終可能成長到單個 rollup 無法安全承載的體量;
- NFT 生態系統的任何部分,甚至整個 NFT 生態系統,都不是封閉的;他們將需要與以太坊生態系統的其他部分進行互操作
本文提出了一個使 NFT 友好跨 rollup 并使其遷移到整個 layer 2 生態中的提案,
提議解決方案一
NFT 可以在單個 rollup 中進行初始注冊,然后通過創建 wrapper NFT (封裝 NFT) 在不同的 rollups (或者是底層鏈) 中轉移,
NFT wrapping 過程如下:
- 在 Rollup A 上,將 NFT (設為 X) 發送到封裝管理器合約 (wrapper manager contract),指定 (i) 目標 Rollup 和 (ii) 初始所有者,加密箱合約 (lockbox contract) 存儲一條記錄,為 X 分配一個新的序列號 R,并保存目標 Rollup (設為 B) 和目標 Rollup 的初始所有者 (設為 01),
- 在 Rollup B 上,任何人都可以使用 Rollup B 上的封裝管理器合約創建 wrapper NFT,創建一個 wrapper NFT 需要指定源 Rollup 和序列號。要創建 X 的一個“有效” wrapper NFT,只能由指定的所有者和通過聲明 (R, A) 作為序列號和源 rollup 完成。注意,有可能會創建一個指向無內容的無效 wrapper NFT,而 Rollup B 無法分辨有效和無效。封裝管理器合約存儲 (序列號、源 Rollup、初始所有者) 值組并防止使用同一個值組創建多個 wrapper NFT。
- 要從加密箱中提出 NFT,Rollup B 上的 wrapped-X 的當前所有者必須將其發送回封裝管理器,后者發布收據說明“序列號為 R、源 rollup A 和初始所有者 01 的 NFT 已經解除封裝,以及潛在的新所有者 02”。
- 加密箱合約可以在收到 rollup B 上收據的證明之后將 NFT X 交由 02,并根據其存儲的資訊檢查序列號、源 Rollup 和初始所有者,并驗證 NFT 的轉移。
請注意,提取 NFT 存在時間延遲,因為 Optimistic Rollup 類解決方案的狀態根需要大約一周的延遲才能最終確定,以便驗證收據,到目前為止,更快地進行多跳的唯一方法是進行多層封裝。
用戶要驗證 wrapped X 是否合法,需要自己驗證 Rollup B 上的狀態和 Rollup A 上的收據。
拓展:增加跨 rollup 轉賬
在 rollup B 上,wrapped-X 的所有者可以將其發送給封裝管理器,并附上一條指令發布不同的收據“序列號為 R、源 Rollup A 和初始所有者為 01 的 NFT 剛剛轉移到 Rollup C,以及潛在的新所有者 02”,
在 Rollup C 上,任何人都可以通過指定原始源 Rollup (在目前示例中為 Rollup A)、序列號和初始所有者來制作 wrapped-X 對象,并且 Rollup C 上的此 wrapped-X 可以進行自由交易,但是一旦如此,提出 wrapped-X 需要發布跨 rollup 轉移產生的所有收據 (當前實例中為 2 個)。
請注意為了簡單起見,“提款”本身不再是跨 rollup 的操作,而是是通過跨 rollup 完成的,在 rollup A 上創建 wrapped-X (X 的同一個 rollup),然后單獨進行一步 unwrapping (解除封裝) 操作,
實際上,當 NFT 從一個 rollup 轉移到另一個 rollup 時,轉移路徑上的鏈會產生一串收據,該收據鏈中的每一個收據都被鏡像到 rollup A,并且在未來,當其他 rollup 的狀態根最終確定時,這些收據將在某個時間點按序被處理 (在短期內可以通過 Kate 承諾進行空間優化,長遠來看可以通過 ZK-SNARK 證明整條收據鏈)。
用戶要驗證 wrapped X 的真實性,需要驗證所有路徑 rollup 反映了跨 rollup 轉移的整個收據鏈 (或者至少是繼上一個收據之后已經鏡像到 rollup A 的收據鏈)。
擴展2:在底層鏈上優化發行 gas
所有 NFT 都可以這種方式發行:由以太坊底層鏈上的加密箱“擁有”。為了優化 gas 的效率,加密箱合約將具備生成一套序列號并將其傳輸到 rollup 的功能,實際上,所有 NFT 都是預先創建的,但尚未分配“意義”給其中任何一個 (可以想象成有 2*256 個尚未分化的“干細胞”NFT),并且它們以批量形式轉移到 rollup,
“發行”過程現在就變成了分配意義的過程。這可以通過在收據中傳遞“含義哈希”來完成,與所有者傳遞的形式相同:如果 NFT 沒有意義 (是一個”干細胞”),所有者可以為其分配一個含義,使其成為一個具有“差異性”的 NFT。底層鏈只有在驗證收據鏈后才知道 NFT 的含義,直到分配含義為止 (實際上,收據驗證必須是 ZK-SNARK 的才具備可行性),
這允許所有 NFT 都在底層鏈中“扎根”,而不是 rollup,這對于處理 rollup 故障、因其他原因不可用或是應用需要永久遷移到其他域的情況來說很有幫助。