跳到主要内容

编写egg.sol

在本小节中,我们将致力于编写egg.sol并实现其功能。

准备工作

首先,删除 hardhat 为我们生成的初始代码。将contracts文件夹下的Lock.sol删除,scripts下的deploy.js删除。

注意

在删除文件过程中,请不要删除任何文件夹!

然后在contracts文件夹下创建新文件egg.solicat.sol,在scripts文件夹下创建新文件test.js

编写智能合约

打开egg.sol,在其中粘贴如下代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract iCatEgg is ERC721 {

constructor() ERC721("iCat Egg", "EGG") {}
}

让我们一行一行来看。

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

我们的宠物蛋被设计为 NFT,因此,在代码的第4行,我们引用了OpenZeppelin的ERC-721库,方便后面将合约部署为NFT。

contract iCatEgg is ERC721 {

这一行代码,通过合约继承关系,,利用上面提到的OpenZeppelin库,将iCatEgg合约设置成了一个NFT的合约。

constructor() ERC721("iCat Egg", "EGG") {}

这一行代码,通过将两个字符串作为参数传递给构造函数,并将NFT的名字设置为iCat Egg,符号设置为EGG

通过上面的描述,我们可以看到,solidity的智能合约有点像其他语言中的class,拥有构造函数等,了解这一点可能会对接下来的学习有帮助。

备注

OpenZeppelin 是一个开源的智能合约开发框架,它为以太坊和其他区块链平台上的去中心化应用(DApps)提供了一套安全、可靠的智能合约组件和工具。该框架旨在帮助开发者构建安全的区块链应用,防范潜在的智能合约漏洞和攻击。更多信息请访问官网

信息

在VSCode中编写solidity代码的时候,引用 OpenZeppelin 库可能会报错:Expected string literal (path), "*" or alias list.,或Source "@openzeppelin/contracts/token/ERC721/ERC721.sol" not found: File import callback not supported,解决办法见这篇文章,如有更好的解决办法欢迎在github discussion讨论。

测试智能合约

编写测试用例

打开test.js,在其中粘贴以下代码

const { ethers } = require("hardhat");

const main = async () => {
// 部署蛋的合约
const eggFactory = await ethers.getContractFactory("iCatEgg");
const eggContract = await eggFactory.deploy();
await eggContract.deployed();
console.log('NFT contract deployed to:', eggContract.address);
}

const runMain = async () => {
try {
await main();
process.exit(0);
}
catch(e) {
console.log(e);
process.exit(1);
}
}

runMain();

一行一行解释代码执行逻辑:

const eggFactory = await ethers.getContractFactory("iCatEgg");

这一行实际上是在编译智能合约,并在artifacts文件夹下生成必要的文件。

const eggContract = await eggFactory.deploy();

在hardhat脚本运行时,它会在电脑上创建一个本地的以太坊网络,在脚本执行完成之后,该网络随即被销毁。因此,这行代码就是将iCatEgg合约部署在这个本地的以太坊网络上。

await eggContract.deployed();

这行代码是等待合约部署完成,避免代码异步执行,后面用到前面的变量,但是变量是空值,类似于await

console.log('NFT contract deployed to:', eggContract.address);

这一行将部署到本地区块链上的合约地址打印出来。

运行测试用例

在运行之前,切换到hardhat.config.js,并将其中的solidity版本设置为0.8.17

现在打开终端,在终端之中输入

npx hardhat run .\scripts\test.js

当你看到下面的输出的时候,证明智能合约编译运行成功

Compiled 13 Solidity files successfully
NFT contract deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3

在下一小节中,我们将进一步完善宠物蛋的功能。