原文标题:《 那个可以跨链的 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 项目方认真努力的精神,但是个人认为这个项目噱头大于实际意义,至少目前的解决方案来看是的。
大家可以关注我的公众号《 今天有更懂这个世界一点了吗 》查阅往期文章,与我进行更深度的交流探讨,也可以关注我的推特:jason_chen998
原文链接
欢迎加入律动 BlockBeats 官方社群:
Telegram 订阅群:https://t.me/theblockbeats
Telegram 交流群:https://t.me/BlockBeats_App
Twitter 官方账号:https://twitter.com/BlockBeatsAsia