代码时间 🎉
参数 | Arbitrum Sepolia | Ethereum Sepolia |
---|---|---|
您可以使用任何区块链开发框架来使用Chainlink CCIP。对于本次训练营,我们准备了Hardhat、Foundry 和 Remix IDE 的步骤说明。
让我们创建一个新项目。
进入网站 https://remix.ethereum.org/ 并点击“Create new Workspace”按钮。选择“Blank”模板并将工作区命名为“CCIP Bootcamp day2”。
或者你可以克隆:
要使用Chainlink CCIP,您需要与 @chainlink/contracts-ccip NPM 包中的一些Chainlink CCIP特定合约进行交互。
安装此包,请按照您用于本x的开发环境进行操作。
我们还需要一个标准的 @chainlink/contracts NPM包用于本模块,所以在这里我们也可以通过运行以下命令来安装它:
最后,对于本次练习,我们还需要安装 @openzeppelin/contracts NPM包。为此,请运行以下命令:
运行:
然后在您的 foundry.toml
或 remappings.txt
文件中设置 remappings 为
我们还需要一个标准的 @chainlink/contracts NPM包用于本模块,所以趁现在我们通过运行以下命令来安装它:
并设置remappings为:
最后对于本次练习,我们还需要安装 @openzeppelin/contracts NPM包。为此,请运行以下命令:
并在 foundry.toml
或 remappings.txt
文件中将 remappings 设置为 @openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/。
创建一个新的 Solidity 文件,并粘贴上以下内容。这是一个空合约,只导入了 @chainlink/contracts-ccip
包中的一个合约。
编译它。如果成功编译并生成了 .deps/npm/@chainlink/contracts-ccip
、.deps/npm/@chainlink/contracts
和 .deps/npm/@openzeppelin/contracts
文件夹,意味着我们已将所有必要的包导入到了 Remix IDE 工作区。
您可以使用 LINK 代币或给定区块链上的原生代币/wrapped原生代币来支付 CCIP 费用。在本次练习中,我们需要至少 1 个 LINK 或 Arbitrum Sepolia 测试网代币。要获取它,请前往https://faucets.chain.link/arbitrum-sepolia
在contracts
文件夹中创建新文件XNFT.sol
运行以下指令来编译:
在src
文件夹中创建新文件XNFT.sol
点击“Create new file”按钮来创建新的Solidity文件XNFT.sol
按照步骤添加必要的环境变量,以便部署这些合约并发送您的第一个 CCIP 消息。
该合约需要至少 0.8.20 的 Solidity 版本。因为在 0.8.20 版本的 Solc 中,默认的 EVM 版本为“上海”。在上海升级中,一个新的操作码 PUSH0 被添加到以太坊虚拟机中。
然而,除了以太坊外的大多数区块链尚未支持 PUSH0 操作码。
这意味着 PUSH0 操作码现在是合约字节码的一部分,如果您正在使用的链不支持它,它将会报出“无效操作码”错误。
为了了解更多信息,我们强烈建议您查看此 StackOverflow 的回复:
我们将使用 @chainlink/env-enc
包来提高安全性。它通过创建一个新的 .env.enc
文件来加密敏感数据,而不是将其以明文形式存储在 .env 文件中。虽然不建议将此文件上传到网络,但如果意外发生,您的机密信息仍然会被加密。 通过运行以下命令来安装该包:
设置一个密码用于加密和解密环境变量文件。您可以稍后通过输入相同的命令来更改密码。
现在设置以下环境变量:PRIVATE_KEY、源区块链的 RPC URL、目标区块链的 RPC URL。在此示例中,我们将使用 Arbitrum Sepolia 和 Ethereum Sepolia。
要设置以上变量,请输入以下命令并按照终端中的说明进行操作:
完成以上操作后,.env.enc 文件将自动生成。如果您想验证您的输入,可以随时运行以下命令:
最后,扩展 hardhat.config
文件以支持这两个网络:
创建一个新文件.env
。在其中填写您的钱包的 PRIVATE_KEY 以及至少两个区块链的 RPC URL。在此示例中,我们将使用 Arbitrum Sepolia 和 Ethereum Sepolia。
完成后,为了加载 .env 文件中的变量,请运行以下命令:
最后,扩展 foundry.toml
文件以支持这两个网络:
点击进入到“Solidity compiler”选项卡
展开“Advanced Configurations”下拉菜单
展开“EVM VERSION”下拉菜单并选择“paris”而不是“default”
点击进入“Deploy & run transactions”选项卡,并从“Environment”下拉菜单中选择“Injected Provider - Metamask”选项。
如果您使用的是 Metamask 钱包,其中已经预装了Ethereum Sepolia 网络。确保您添加了 Arbitrum Sepolia 网络。
访问 Chainlist.org 并搜索“arbitrum sepolia”。一旦看到 Chain ID 为 421614 的网络,点击“Add to Metamask”按钮。
准备 Ethereum Sepolia 的 Chain Selector 和 CCIP Router & LINK 代币合约地址。您可以在页面开头滚动查看以获取这些地址。#ccip-config-details
进入scripts
文件夹并创建一个名为 deployXNFT.ts
的新文件。
运行部署脚本:
准备 Ethereum Sepolia 的 Chain Selector 和 CCIP Router & LINK 代币合约地址。您可以在页面开头滚动查看以获取这些地址。#ccip-config-details
通过运行以下命令部署 XNFT.sol
在 scripts
文件夹下创建文件 XNFT.s.sol
请注意,此示例中的XNFT 的部署是直接硬编码 Ethereum Sepolia 的相关配置,但您可以重构以下部署脚本以支持其他网络。这里可参考 CCIP Starter Kit (Foundry version) 。
运行以下指令来部署XNFT.sol
:
准备 Ethereum Sepolia 的 Chain Selector 和 CCIP Router & LINK 代币合约地址。您可以在页面开头滚动查看以获取这些地址。#ccip-config-details
打开 Metamask 钱包,切换到 Ethereum Sepolia 网络。
打开 XNFT.sol 文件。
打开“Solidity Compiler”选项卡,然后点击“Compile XNFT.sol”按钮。
打开“Deploy & run Transaction”选项卡,然后在“Environment”下拉菜单中选择“Injected Provider - Metamask”选项。确保`chainId`切换为11155111(如果没有切换,你需要在浏览器中刷新Remix IDE页面)
在“Contract”下拉菜单中,确保被选中的是“XNFT - XNFT.sol”。
找到橘黄色的按钮“Deploy”。在 ccipRouterAddress
中填入0x0bf3de8c5d3e8a2b34d2beeb17abfcebaf363a59
,在 linkTokenAddress
中填入 0x779877A7B0D9E8603169DdbD7836e478b4624789
,在 currentChainSelector
中填入 16015286601757825753
。
点击橘黄色的“Deploy/Transact”按钮。
Metamask 通知会弹出来,对交易进行签名。
准备 Arbitrum Sepolia 的 Chain Selector 和 CCIP Router & LINK 代币合约地址。您可以在页面开头滚动查看以获取这些地址。#ccip-config-details
进入scripts
文件夹并创建一个名为 deployXNFTArbitrum.ts
的新文件。
运行部署脚本:
准备 Arbitrum Sepolia 的 Chain Selector 和 CCIP Router & LINK 代币合约地址。您可以在页面开头滚动查看以获取这些地址。#ccip-config-details
选项 1)
通过运行以下命令部署 XNFT.sol
在 scripts
文件夹下创建文件 XNFTArbitrum.s.sol
请注意,此示例中的XNFT 的部署是直接硬编码 Arbitrum Sepolia 的相关配置,但您可以重构以下部署脚本以支持其他网络。这里可参考 CCIP Starter Kit (Foundry version) 。
运行以下指令来部署XNFT.sol
:
准备 Arbitrum Sepolia 的 Chain Selector 和 CCIP Router & LINK 代币合约地址。您可以在页面开头滚动查看以获取这些地址。#ccip-config-details
打开您的 Metamask 钱包并切换到 Arbitrum Sepolia 网络。
打开 XNFT.sol 文件。
点击进入“Solidity Compiler”选项卡并点击“Compile XNFT.sol”按钮。
点击进入“Deploy & run transactions”选项卡,并从“Environment”下拉菜单中选择“Injected Provider - Metamask”选项。确保 chainId 切换到 421614(如果没有,您可能需要刷新浏览器中的 Remix IDE 页面)。
在“Contract”下拉菜单中,确保选择了“XNFT - XNFT.sol”。
找到橙色的“Deploy”按钮。提供以下信息:
ccipRouterAddress:0x2a9c5afb0d0e4bab2bcdae109ec4b0c4be15a165
linkTokenAddress:0xb1D4538B4571d411F07960EF2838Ce337FE1E80E
currentChainSelector:3478487238524512106
点击橙色的“Deploy”/“Transact”按钮。
Metamask 通知将弹出。签署交易。
需要准备:
您之前部署到 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方法:
需要准备:
您之前部署到 Ethereum Sepolia 的 XNFT.sol 智能合约地址;
您之前部署到 Arbitrum Sepolia 的 XNFT.sol 智能合约地址;
chainSelector
参数:3478487238524512106,这是 Arbitrum Sepolia 网络的 CCIP Chain Selector;
ccipExtraArgs
参数:0x97a657c90000000000000000000000000000000000000000000000000000000000030d40,这是 CCIP extraArgs 的bytes版本,其中gasLimit为默认值 200_000。
如果您想自己计算这个值,可以重用以下辅助智能合约。在scripts
文件夹内创建文件EncodeExtraArgs.s.sol
并在其中粘贴以下代码:
运行:
在“Deployed Contracts”部分,您应该能找到之前部署到 Ethereum Sepolia 的 XNFT.sol 合约。找到 enableChain
函数并提供以下参数:
chainSelector
参数:3478487238524512106,这是 Arbitrum Sepolia 网络的 CCIP Chain Selector;
您之前部署到 Arbitrum Sepolia 的 XNFT.sol 智能合约地址,作为 xNftAddress 参数;
ccipExtraArgs
参数:0x97a657c90000000000000000000000000000000000000000000000000000000000030d40,这是 CCIP extraArgs 的bytes版本,其中gasLimit为默认值 200_000。
点击橙色的“Transact”按钮。 如果您想自己计算这个值,可以重用以下辅助智能合约。创建 EncodeExtraArgs.sol
文件并粘贴以下代码:
需要准备:
您之前部署到 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方法:
需要准备:
您之前部署到 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
文件夹内创建文件EncodeExtraArgs.s.sol
并在其中粘贴以下代码:
运行:
在“Deployed Contracts”部分,您应该能找到之前部署到 Arbitrum Sepolia 的 XNFT.sol
合约。找到 enableChain
函数并提供以下参数:
chainSelector
参数:16015286601757825753,这是 Ethereum Sepolia 网络的 CCIP Chain Selector;
您之前部署到 Ethereum Sepolia 的 XNFT.sol
智能合约地址,作为 xNftAddress
参数;
ccipExtraArgs
参数:0x97a657c90000000000000000000000000000000000000000000000000000000000030d40,这是 CCIP extraArgs 的bytes版本,其中gasLimit为默认值 200_000。
点击橙色的“Transact”按钮。 如果您想自己计算这个值,可以重用以下辅助智能合约。创建 EncodeExtraArgs.sol
文件并粘贴以下代码:
为支付 CCIP 费用,向XNFT.sol
充值一定数量的 LINK。3 个 LINK 对于此演示应该绰绰有余。当然,为了实现完整的功能,您还应在其他区块链上为XNFT.sol
智能合约充值,以便在所有区块链之间执行跨链转账。
在scripts文件夹中创建
TypeScript文件mint.ts:
运行以下指令调用mint方法:
执行:
在“Deployed Contracts”部分,您应该能找到之前部署到 Arbitrum Sepolia 的 XNFT.sol
合约。找到 mint
函数,然后点击橙色的“Transact”按钮。
需要准备:
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方法:
需要准备:
from
参数:您的 EOA 地址;
to
参数:您希望跨链转移您的 NFT 的另一个链上的 EOA 地址,可以是您的 EOA 地址;
tokenId
参数:您要跨链转移的 xNFT 的 ID;
destinationChainSelector
参数:16015286601757825753,这是 Ethereum Sepolia 区块链的 CCIP Chain Selector;
payFeesIn
参数:1,表示我们用 LINK 支付 CCIP 费用。
运行:
在“Deployed Contracts”部分,您应该能找到之前部署到 Arbitrum Sepolia 的 XNFT.sol
合约。找到 crossChainTransferFrom
函数并提供以下参数:
from
参数:您的 EOA 地址;
to
参数:您希望跨链转移您的 NFT 的另一个链上的 EOA 地址,可以是您的 EOA 地址;
tokenId
参数:您要跨链转移的 xNFT 的 ID;
destinationChainSelector
参数:16015286601757825753,这是 Ethereum Sepolia 区块链的 CCIP Chain Selector;
payFeesIn
参数:1,表示我们用 LINK 支付 CCIP 费用。
点击橙色的“Transact”按钮。
您现在可以在 CCIP Explorer 页面监控此次NFT的跨链转移。
一旦跨链 NFT 到达 Ethereum Sepolia,您可以在 Metamask 钱包中手动显示它。点击进入“NFT”选项卡并点击“Import NFT”按钮。
然后填写 Ethereum Sepolia 上的 XNFT.sol
智能合约地址和您收到的代币 ID(0)。
最后,您的 NFT 将显示在 Metamask 钱包中。
Chain Selector
Copy
Copy
CCIP 路由合约地址
0x2a9c5afb0d0e4bab2bcdae109ec4b0c4be15a165
0x0bf3de8c5d3e8a2b34d2beeb17abfcebaf363a59
LINK Token i之
0xb1D4538B4571d411F07960EF2838Ce337FE1E80E
0x779877A7B0D9E8603169DdbD7836e478b4624789