练习 2: 创建你的首个跨链NFT

代码时间 🎉

CCIP 配置参数

参数
Arbitrum Sepolia
Ethereum Sepolia

Chain Selector

Copy

Copy

CCIP 路由合约地址

0x2a9c5afb0d0e4bab2bcdae109ec4b0c4be15a165

0x0bf3de8c5d3e8a2b34d2beeb17abfcebaf363a59

LINK Token i之

0xb1D4538B4571d411F07960EF2838Ce337FE1E80E

0x779877A7B0D9E8603169DdbD7836e478b4624789

开始使用

您可以使用任何区块链开发框架来使用Chainlink CCIP。对于本次训练营,我们准备了Hardhat、Foundry 和 Remix IDE 的步骤说明。

让我们创建一个新项目。

确保你已安装 Node.jsNPM。使用下列命令进行检查:

node -v
npm -v

创建一个新的文件夹并命名为ccip-masterclass-3

mkdir ccip-masterclass-3

进入该文件夹

cd ccip-masterclass-3

运行下面命令来创建一个新的Hardhat工程:

npx hardhat init

然后选择"Create a TypeScript project"。

或者你可以克隆:

要使用Chainlink CCIP,您需要与 @chainlink/contracts-ccip NPM 包中的一些Chainlink CCIP特定合约进行交互。

安装此包,请按照您用于本x的开发环境进行操作。

我们还需要一个标准的 @chainlink/contracts NPM包用于本模块,所以在这里我们也可以通过运行以下命令来安装它:

最后,对于本次练习,我们还需要安装 @openzeppelin/contracts NPM包。为此,请运行以下命令:

水龙头

您可以使用 LINK 代币或给定区块链上的原生代币/wrapped原生代币来支付 CCIP 费用。在本次练习中,我们需要至少 1 个 LINK 或 Arbitrum Sepolia 测试网代币。要获取它,请前往https://faucets.chain.link/arbitrum-sepolia

LogoGet Arbitrum Sepolia Testnet LINK Tokens | Chainlink Faucets

Chainlink水龙头

开发xNFT智能合约

contracts文件夹中创建新文件XNFT.sol

运行以下指令来编译:

准备部署

按照步骤添加必要的环境变量,以便部署这些合约并发送您的第一个 CCIP 消息。

该合约需要至少 0.8.20 的 Solidity 版本。因为在 0.8.20 版本的 Solc 中,默认的 EVM 版本为“上海”。在上海升级中,一个新的操作码 PUSH0 被添加到以太坊虚拟机中。

然而,除了以太坊外的大多数区块链尚未支持 PUSH0 操作码。

这意味着 PUSH0 操作码现在是合约字节码的一部分,如果您正在使用的链不支持它,它将会报出“无效操作码”错误。

为了了解更多信息,我们强烈建议您查看此 StackOverflow 的回复:

在不同的开发环境下设置solc EVM版本

我们将使用 @chainlink/env-enc包来提高安全性。它通过创建一个新的 .env.enc 文件来加密敏感数据,而不是将其以明文形式存储在 .env 文件中。虽然不建议将此文件上传到网络,但如果意外发生,您的机密信息仍然会被加密。 通过运行以下命令来安装该包:

设置一个密码用于加密和解密环境变量文件。您可以稍后通过输入相同的命令来更改密码。

现在设置以下环境变量:PRIVATE_KEY、源区块链的 RPC URL、目标区块链的 RPC URL。在此示例中,我们将使用 Arbitrum Sepolia 和 Ethereum Sepolia。

要设置以上变量,请输入以下命令并按照终端中的说明进行操作:

完成以上操作后,.env.enc 文件将自动生成。如果您想验证您的输入,可以随时运行以下命令:

最后,扩展 hardhat.config 文件以支持这两个网络:

步骤1)在Ethereum Sepolia上部署XNFT.sol

准备 Ethereum Sepolia 的 Chain Selector 和 CCIP Router & LINK 代币合约地址。您可以在页面开头滚动查看以获取这些地址。CCIP 配置参数

进入scripts文件夹并创建一个名为 deployXNFT.ts的新文件。

运行部署脚本:

步骤 2) 在Arbitrum Sepolia上部署XNFT.sol

准备 Arbitrum Sepolia 的 Chain Selector 和 CCIP Router & LINK 代币合约地址。您可以在页面开头滚动查看以获取这些地址。CCIP 配置参数

进入scripts文件夹并创建一个名为 deployXNFTArbitrum.ts的新文件。

运行部署脚本:

步骤 3) 在Ethereum Sepolia网络中, 调用enableChain方法

需要准备:

  • 您之前部署到 Ethereum Sepolia 的 XNFT.sol 智能合约地址;

  • 您之前部署到 Arbitrum Sepolia 的 XNFT.sol 智能合约地址;

  • chainSelector 参数:3478487238524512106,这是 Arbitrum Sepolia 网络的 CCIP Chain Selector;

  • ccipExtraArgs 参数:0x97a657c90000000000000000000000000000000000000000000000000000000000030d40,这是 CCIP extraArgs 的bytes版本,其中gasLimit为默认值 200_000。

如果您想自己计算这个值,可以重用以下辅助智能合约:

scripts文件夹中创建TypeScript文件enableChain.ts

运行以下指令来调用enableChain方法:

步骤 4) 在Arbitrum Sepolia网络中, 调用enableChain方法

需要准备:

  • 您之前部署到 Arbitrum Sepolia 的 XNFT.sol 智能合约地址;

  • 您之前部署到 Ethereum Sepolia 的 XNFT.sol 智能合约地址,作为 xNftAddress 参数;

  • chainSelector 参数:16015286601757825753,这是 Ethereum Sepolia 网络的 CCIP Chain Selector;

  • ccipExtraArgs 参数:0x97a657c90000000000000000000000000000000000000000000000000000000000030d40,这是 CCIP extraArgs 的bytes版本,其中gasLimit为默认值 200_000。

如果您想自己计算这个值,可以重用以下辅助智能合约:

scripts文件夹中创建TypeScript文件enableChainArbitrum.ts

运行以下指令来调用enableChain方法:

为支付 CCIP 费用,向XNFT.sol充值一定数量的 LINK。3 个 LINK 对于此演示应该绰绰有余。当然,为了实现完整的功能,您还应在其他区块链上为XNFT.sol智能合约充值,以便在所有区块链之间执行跨链转账。

为您的xNFT充值LINK

步骤 6) 在Arbitrum Sepolia网络中, 铸造新的xNFT

scripts文件夹中创建TypeScript文件mint.ts:

运行以下指令调用mint方法:

步骤 7) 在Arbitrum Sepolia网络中, 跨链转移xNFT

需要准备:

  • from 参数:您的 EOA 地址;

  • to 参数:您希望跨链转移您的 NFT 的另一个链上的 EOA 地址,可以是您的 EOA 地址;

  • tokenId 参数:您要跨链转移的 xNFT 的 ID;

  • destinationChainSelector 参数:16015286601757825753,这是 Ethereum Sepolia 区块链的 CCIP Chain Selector;

  • payFeesIn 参数:1,表示我们用 LINK 支付 CCIP 费用。

scripts 文件夹下创建一个 TypeScript 文件crossChainTransferFrom.ts

运行以下指令调用crossChainTransferFrom方法:

您现在可以在 CCIP Explorer 页面监控此次NFT的跨链转移。

CCIP Explorer

一旦跨链 NFT 到达 Ethereum Sepolia,您可以在 Metamask 钱包中手动显示它。点击进入“NFT”选项卡并点击“Import NFT”按钮。

Import NFT

然后填写 Ethereum Sepolia 上的 XNFT.sol 智能合约地址和您收到的代币 ID(0)。

Fill in NFT details

最后,您的 NFT 将显示在 Metamask 钱包中。

Last updated