剖析Gh0stlyGh0sts:可以跨7条链的NFT是如何实现的?
原标题:《那个可以跨链的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应该是存储不同链的合约地址的,才需要在这里校验你要转移的目标链是否存在对应合约。
我们输入币安链的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的关联。…