创建跨链NFT
如何设计一个跨链NFT的智能合约
什么是跨链NFT?
跨链 NFT 是一种可以存在于任何区块链上的智能合约,从而无需用户明确知道他们当前正在使用哪个区块链。
通常,NFT 从一个链移动到另一个链是件引人注目的事,但这一简单事实却带来了一个更大的问题,即 Web3 中间件基础设施的可靠性和安全性。在一个无缝的跨链世界中,将数字资产从一个链移动到另一个链应该像在同一区块链上提交交易一样正常。
当 NFT 从一个区块链转移到另一个区块链时,它就成为跨链 NFT。
跨链NFT是如何工作的?
从总体上看,NFT是区块链上的数字代币,具有与链上其他任何代币不同的唯一标识符。
本质上,任何NFT都是单一区块链上的智能合约实现的。智能合约可以说是这个等式中最重要的部分,因为它控制着NFT的实现:铸造的数量、铸造的时间、分发所需满足的条件等。这意味着任何跨链 NFT 的实现至少需要在两个区块链上部署两个智能合约,并且它们之间需要互联。
这就是跨链NFT看起来样子——存在于多个区块链上的等效 NFT。
考虑到这一点,跨链 NFT 可以通过以下三种方式实现:
销毁与铸造:一个NFT所有者将他的NFT放入源链上的智能合约并将其销毁,从而将该NFT从该区块链中移除。一旦完成以上过程,另一个等效的NFT会从目标区块链上的对应智能合约中被创建。这个过程是可逆的。
锁定与铸造:NFT所有者将其 NFT锁定在源链上的智能合约中,并在目标区块链上创建一个等效的 NFT。当所有者想要将其NFT移回到源链上时,他们可以销毁目标链上的NFT,从而解锁源区块链上的NFT。
锁定与解锁:同一个NFT系列在多个区块链上铸造。NFT所有者可以在源区块链上锁定其NFT,以解锁目标区块链上的等效NFT。这意味着即使在多个区块链上存在着该NFT的多个实例,同一时间也只有一个NFT是活跃可使用的。
在本次大师班中,我们将实现销毁与铸造机制。
在每种情况中都需要一个跨链消息协议来从一个区块链向另一个区块链发送数据指令。
如何使用 Chainlink CCIP 创建跨链 NFT?
使用Chainlink CCIP构建跨链NFT之前,首先让我们了解一下可以用Chainlink CCIP做什么。通过 Chainlink CCIP,我们可以:
转移(支持的)代币
发送任何类型的数据
同时发送代币和数据
CCIP的发送者可以是:
EOA账户
任何合约账户
CCIP的接受者可以是:
EOA账户
任何实现了
CCIPReceiver.sol
的智能合约
实现销毁-铸造模型
通过Chainlink CCIP实现销毁-铸造模型,我们将在跨链转移功能中销毁源区块链(Arbitrum Sepolia)上的NFT,并使用Chainlink CCIP发送跨链消息。我们需要编码收发地址、NFT的 tokenId和tokenURI,以便在目标区块链接收到跨链消息后能够铸造完全相同的 NFT。
Arbitrum Sepolia 端:
Ethereum Sepolia端:
这种设计允许跨链双向转移,即使用完全相同的代码和销毁-铸造机制从Ethereum Sepolia返回到Arbitrum Sepolia。
NFT的元数据
对于这个跨链NFT,我们将使用托管在IPFS上的四个Chainlink Warriors作为元数据。
Chainlink Elf,可以在以下链接查看:https://ipfs.io/ipfs/QmTgqnhFBMkfT9s8PHKcdXBn1f5bG3Q5hmBaR4U6hoTvb1
Chainlink Knight,可以在以下链接查看:https://ipfs.io/ipfs/QmZGQA92ri1jfzSu61JRaNQXYg1bLuM7p8YT83DzFA2KLH
Chainlink Orc,可以在以下链接查看:https://ipfs.io/ipfs/QmW1toapYs7M29rzLXTENn3pbvwe8ioikX1PwzACzjfdHP
Chainlink Witch,可以在以下链接查看: https://ipfs.io/ipfs/QmPMwQtFpEdKrUjpQJfoTeZS1aVSeuJT6Mof7uV29AcUpF
开发最佳实践
本次练习中,我们将尝试遵循一些CCIP最佳实践。整个完整列表应参考Chainlink官方文档。
验证源链、目标链、发送者和接收者地址
在本次练习中,确保跨链消息在跨链 NFT 智能合约之间发送是至关重要的。为此,我们需要使用 CCIP 链选择器在不同区块链上跟踪这些地址的记录。
验证Router地址
在目标链上的合约中实现 ccipReceive
方法时,验证 msg.sender
是否为正确的Router地址。此验证确保只有Router合约可以调用接收合约上的 ccipReceive
函数,并为希望限制哪些账户可以调用ccipReceive
的开发人员使用。
设置gasLimit
设置gasLimit
gasLimit
指定了CCIP在目标区块链上的合约中执行 ccipReceive()
可以消耗的最大gas量。它是确定发送消息费用的主要因素。未使用的 gas不会退还。
使用extraArgs
extraArgs
extraArgs
是为了兼容未来的 CCIP 升级。为了获得这个特性,请确保extraArgs
在生产部署中是可变的。这允许您在链下构建它,并将其传递给函数调用或存储在可以按需更新的变量中。
如果extraArgs
为空值,系统将默认 gasLimit 为 200,000。 为了使extraArgs
可变,请在前面提及的enableChain
函数中设置它们。你可以创建一个合约作为工具来计算要传递的bytes值
,如下所示:
Last updated