这篇文章触及代码相对较多,或许会略有枯燥,请耐心看完然后了解其间原理。
这几天各个群都在传一个叫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亿美金融资,可见跨链这个操作至少十分受本钱喜爱。
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的关联。
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的图片就会多出来一个灰色的边框,同理在币安链的#6000NFT会多出来个蓝色的边框。
这个操作是我怎样样都没想到的,我一开端认为用了很高级的手法所以不断的看代码想找出改变baseURI的业务逻辑,研讨了整整1小时没看出来,没想到竟然用的是这种操作方法。
以上便是Gh0stlyGh0sts是怎么完成跨链+多链mint+前后链改变样式的效果,综合来看,这套计划不具有任何普适性,操作繁琐复杂度很高,远远没有ERC721A的那种简单且收益高的效果,我很敬佩Gh0stlyGh0sts项目方仔细努力的精神,但是个人认为这个项目噱头大于实际意义,至少目前的解决计划来看是的。