header-langage
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
掃碼下載APP
Partnered With:

觀點:實現跨鏈的Gh0stlyGh0sts會是下一個Azuki嗎?

閱讀本文需 18 分鐘
剖析引發熱議的Gh0stlyGh0sts的跨鏈到底是怎麼回事
原文標題:《 那個可以跨鏈的 Gh0stlyGh0sts 會成爲下一個 Azuki 嗎? 》    
原文作者:今天有更懂這個世界一點了嗎
本文來自微信公衆號:今天有更懂這個世界一點了嗎


這篇文章涉及代碼相對較多,可能會略有枯燥,請耐心看完從而理解其中原理。


    這幾天各個羣都在傳一個叫 Gh0stlyGh0sts 的項目,作爲一個 free mint 的項目已經實現了單日百倍漲幅,這背後最主要的原因是大家都在熱議它可以實現跨鏈的技術創新。


    還記得上一次技術創新後的藍籌股是誰嗎?Azuki,它帶火了 ERC721A,具體各位可以看之前的文章 web3 的世界一片蠻荒-詳解 ERC721A。


    之前的文章中也多次提到過 web3 是一個極其依賴技術創新的領域,一方面可以釋放出更多上層應用潛力,另一方面因爲土狗項目太多的緣故,使得有技術創新的項目方會直接被視爲願意長期做事的,從而產生 fomo 情緒,所以從技術創新這一點來看,Gh0stlyGh0sts 是有可能具備 Azuki 基因的。


    但是經過研究後,我認爲它的這些操作可複製性不高,相比於 ERC721A 非常重,帶來的收益有限,所以我認爲它不會成爲下一個 Azuki,或者這套解決方案難以像 ERC721A 一樣大規模使用,具體的原因請耐心往下看,文末最後會講到,但請注意本文不提供任何投資建議。


    在大家都在喊這個項目牛逼能跨鏈黑科技的時候,我們公衆號致力於幫助大家更深刻的理解原理本質,所以本文爲大家拋析 Gh0stlyGh0sts 的跨鏈到底誰怎麼回事。


    我們從它的 twitter 中可以看到自稱是全球首個 omnichain 全鏈式 NFT 項目。



    我們先按照時間線看一下他們最開始也是最重要的四條 twitter。


    它說自己說第一個原生的全鏈 NFT,它可以在任何一條鏈上 mint 和轉移,所在的原始鏈(即 mint 鏈)和當前鏈這兩個因素會分別影響 NFT 的背景顏色與邊框顏色,故你可以一眼看出這個 NFT 的前世今生,而我們常見的跨鏈橋如 Wormhole 實現的方式是先在一條鏈上 mint 後,將其鎖定在跨鏈橋的合約中,再在另外一條鏈上 mint 出來一個新的去流動,所以強調了自己與傳統跨鏈橋的區別。


所以他相比於傳統跨鏈橋的區別在於三點:


- 可以在任何一個鏈上 mint 而非先在一個鏈 mint


- 可以實現真正的「轉移」的而非先鎖定一個再複製一個


- 原始鏈和當前鏈會影響 NFT 樣式



    可以看到確實因爲其前世今生不同使得背景和邊框都是不一樣的。



    再向前翻,說到當一個 NFT 轉移時,會先將這條鏈上的 NFT burn 掉再在另外一條鏈 mint 一個新的出來,那這就是它的原理了,單純從這裏看,好像就是相比於傳統跨鏈橋把鎖定動作改成了 burn,我們繼續研究看到底有沒有點東西。



    這裏他說使用了 Layer Zero 協議從而實現了跨鏈,嗯.. 那說明關鍵點在這個 Layer Zero。



    上下文了解清楚了,我們開始解析,那首先從這個 Layer Zero 開始研究。


    首先跨鏈爲什麼重要不言而喻,每個鏈你可以將它當作銀行,如果銀行無法跨行轉賬,你的資產流動性和效益將會大大減弱,LayerZero 剛完成了 A16Z、紅杉資本等投資的 1.35 億美金融資,可見跨鏈這個操作至少非常受資本喜歡。


    這是他們的論文,感興趣的可以親自啃一遍:


    https://layerzero.network/pdf/LayerZero_Whitepaper_Release.pdf


    Layer Zero 之所以叫 Zero,從名字上就說明它和以太坊、Solana 這些 Layer1 不是一個緯度的,建立在這些 Layer1 上的跨鏈橋原理基本都如上所說,在一個鏈上鎖定資產後再在另外一條鏈產生資產,鎖定資產的過程即這些跨鏈橋託管資產,這也就是爲什麼經常爆出跨鏈橋被黑客攻擊的事,從而大家對於將資產託管給跨鏈橋也愈發不信任,除去安全性,跨鏈橋在操作上也非常繁瑣需要多次進行轉移並繳納多次 gas 費,而 Layer Zero 並不鎖定託管資產,Layer Zero 是更底層的一個通信協議,直接在兩條鏈之間進行信息傳遞,其實簡單粗暴的理解就是 Layer Zero 在多個鏈之間部署了自己節點,這些節點幫助你在兩條鏈之間通信,比如你在 A 鏈的合約中調用 B 鏈的節點,告訴它你要轉移一個 NFT,於是該節點幫助你在 B 之間創建一個新的 NFT 出來,這兩個節點就承擔了通信的任務,所以原理還是很簡單的。


    我們看一下 Gh0stlyGh0sts 合約代碼,其中 traverseChains 這個函數執行的就是跨鏈操作,需要輸入兩個參數 chainId 鏈 id 和 tokenId。



    先進行持有人驗證,再將 chainId 傳入了一個 trustedRemoteLookup 數組驗證它的長度是否大於 0,這個操作是幹嘛的呢?


    我們上 Layer Zero 的文檔看到該協議每一條鏈都會對應一個 id,所以傳入的 chainId 代表着你要將 NFT 轉移到哪個鏈上去,所以這個 trustedRemoteLookup 應該是存儲不同鏈的合約地址的,才需要在這裏校驗你要轉移的目標鏈是否存在對應合約。



    我們輸入 Binance 鏈的 id2 試一下,果真返回了對應的合約地址。



    接着執行了 burn 操作將你的 NFT 銷燬,burn 先獲取到了這個 NFT 的持有人,然後執行了_beforeTokenTransfer,這個函數需要傳入的參數有三個,from、to 和 tokenid,當 from 爲 0 時代表着鑄造,當 from 和 to 都不爲 0 時代表轉移,當 from 不爲 0 但是 to 爲 0 代表着銷燬,所以在這裏將 to 傳入 0 進行銷燬,同時執行 approve 取消該 tokenid 的一切授權,然後將原本持有人的餘額減 1,並在 mapping 持有關係中刪除持有人和 tokenid 的關聯。



    endpoint 即調用了 Layer Zero 接口分別傳入了要轉移的目標鏈 chainId、目標鏈的合約地址 trustedRemoteLookup[_chainId] 等信息,其中 payload 參數代表着你要傳輸給目標鏈的信息,可以在代碼中看到它傳輸過去了兩個參數當前用戶合約地址 msg.sender 和 tokenId,那我們可以猜想到目標鏈一定會有個 mint 函數用到這兩個參數來 mint 出一個新的 NFT。



    Layer Zero 的 send 消息被目標鏈接捕獲後會執行 lzReceive 函數,我們一層層向上順藤摸瓜,可以看到 lzReceive 首先對傳過來的 payload 信息進行了解碼,然後又執行了_safeMint 函數新鑄造了對應的 NFT。



    怎麼在各個鏈之間轉移我們明白了,接下來讓我們看看它是怎麼實現可以在不同的鏈 mint 的,我剛開始看到這個能力的時候,第一時間想到的是怎麼做去重,因爲 mint 都是按照 tokenid 遞增的,比如我在以太坊 mint 了 #1,那接下來 polygon 必須要從 #2 開始 mint,這麼多鏈來回 mint 那不亂套了,當我看到他們的解決方案時有點樂了..


    下圖左右兩邊是兩個不同鏈上的合約代碼,分別設定了兩個參數爲開始和截止的 tokenid,即我在以太坊只能 mint 第 0~3084 個,我在 arbitrum 則只能 mint 第 6476~7092 個,所以你在哪些鏈能 mint 都是事先寫死的,外面的人不知道還以爲很智能,實際上用的方式很粗暴。



    別忘了它還有一個特點,就是不同的的鏈背景色不一樣,跨鏈後的邊框顏色也不一樣,如下圖我打開了一個跨到以太坊的 NFT,顯示它的誕生鏈是 Polygon,確實是追溯到了,很神奇對不對。



    等我研究完後真雷到我了,且聽慢慢分析。


    我聽到這個特性後,第一時間想的是如何能夠「動態」識別跨鏈後的 token 並自動變更 baseURI?大家都知道每一個 token 對應的是一個存儲在 ipfs 上的鏈接,這個鏈接存儲了它的屬性和圖片,那比如我的 NFT 原本在 A 鏈,這時候我把它跨到了 B 鏈,那就首先要有一段代碼來自動的生成一個存儲跨鏈前後屬性的 json 文件,並自動生成圖片,然後再把它傳到 ipfs,替換掉舊的鏈接,再映射到 token,可是 ipfs 是不允許改的呀,這是行不通的,在我百思不得其解的時候,我打開了他們的 ipfs 文件。


    可以看到它是用一個大文件夾包了 7 條鏈子文件夾,子文件夾又是對應的 json 文件,然後每個子文件夾大小都是一樣的 4.2M。



    然後我花了近半個小時不斷的理解這裏面的原因,這代表着什麼呢?最終終於明白了,它事先把所有的可能性全部窮舉出來了。


    還記得上文中說到事先用代碼硬編碼寫好了每個鏈可以 mint 的編號區間,然後它先生成了 1 萬個全部 NFT 的 json 文件,並按照區間設定好其誕生鏈,以及背景圖,比如設定第 6000 個 NFT 的誕生鏈爲 polygon,背景色爲紫色,此時是沒有邊框的,所以如果 #6000NFT 還沒有跨鏈,那正常的就會通過上圖中的 poly 來索引。


    接着它把這 1 萬個 NFT 的 json 文件複製了 7 遍,然後再把不屬於本鏈中的 NFT 加上一個本鏈邊框,比如剛纔提到 #6000 誕生鏈是 polygon,於是在 eth 的文件夾裏 #6000 的圖片就會多出來一個灰色的邊框,同理在Binance鏈的 #6000NFT 會多出來個藍色的邊框。


    這個操作是我怎麼樣都沒想到的,我一開始以爲用了很高級的手法所以不斷的看代碼想找出變更 baseURI 的業務邏輯,研究了整整 1 小時沒看出來,沒想到居然用的是這種操作方式。


    以上就是 Gh0stlyGh0sts 是如何實現跨鏈+多鏈 mint+前後鏈變更樣式的效果,綜合來看,這套方案不具有任何普適性,操作繁瑣複雜度很高,遠遠沒有 ERC721A 的那種簡單且收益高的效果,我很敬佩 Gh0stlyGh0sts 項目方認真努力的精神,但是個人認爲這個項目噱頭大於實際意義,至少目前的解決方案來看是的。


原文鏈接


歡迎加入律動 BlockBeats 官方社群:

Telegram 訂閱群:https://t.me/theblockbeats

Telegram 交流群:https://t.me/BlockBeats_App

Twitter 官方帳號:https://twitter.com/BlockBeatsAsia

举报 糾錯/舉報
選擇文庫
新增文庫
取消
完成
新增文庫
僅自己可見
公開
保存
糾錯/舉報
提交