初始化合约
简述
本教程中,我们将使用 Remix 运行 Solidity 合约。
Remix 是以太坊官方推荐的智能合约集成开发环境(IDE),适合新手,提供了一个易于使用的界面,可以在浏览器中快速编写、编译和部署智能合约,无需在本地安装任何程序。
Solidity 是一门为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 JavaScript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型。
面板
进入Remix,我们可以看到如下图所示的界面:

像你看到的这样,Remix 由三个面板和一个终端组成。
- 图标面板-点击可更改侧面板中显示的插件;
 - 侧面板–大多数插件(并非所有插件)的界面都在这里;
 - 主面板-用于编辑文件、大幅面工具和主页选项卡;
 - 终端-用于查看交易收据和各种日志。
 
图标面板

简单介绍下侧栏图标功能,后边我们用到了会更加详细的介绍讲解。Home 总是能打开主页面的,即使他被关闭掉了。File explorer 用于管理工作区和文件。Search 是一个全局搜索功能。Solidity Compiler 是合约编译器界面,界面中默认展示编译器的基础配置项和Advanced Configurations 按钮打开高级配置面板。Deploy&Run 是为了将交易发送到当前的环境中。Debugger 是一个调试器,调试交易的时候,调试器会显示合约的状态。Plugin Manager是插件管理器,里边有非常多的插件可以选择安装。Setting 里会有一些基础的设置项,如语言,主题,GitHub 访问令牌,常规设置等。
工作区和文件
Remix中的WORKSPACES 是分隔项目的特殊文件夹。 一个工作区的文件不能导入或访问另一个不同工作区的文件。
如下图所示,点击图标 1 可以切换不同的工作空间,图标 2 可以进行Create,Clone,Rename,Download,Delete 等等一系列的对于工作空间的操作。
 
创建
我们本次的教程是通过Create 按钮,进行演示的。
当我们点击Create 时,会弹出Create Workspace 的弹窗,Remix 提供了以下模板:
- Basic
 - Blank
 - OpenZeppelin ERC20
 - OpenZeppelin ERC721
 - OpenZeppelin ERC1155
 - 0xProject ERC20
 - Gnosis MultiSig
 
当选择一个OpenZeppelin 库的 ERC721 模板时,可以添加额外的功能。
ERC721(Ethereum Request for Comments 721),由 William Entriken、Dieter Shirley、Jacob Evans、Nastassia Sachs 在 2018 年 1 月提出,是一个在智能合约中实现代币 API 的非同质化代币标准。
OpenZeppelin是一个用于安全智能合约开发的库,内置了很多常用合约的标准实现。
 
勾选上 Mintable,表示我们向模板合约里添加了Mint 的方法,然后点击 OK。
到这里,我们的Workspace 就新建好了。如下图:

.deps 目录下是我们安装的 @openzeppelin 的 npm 包,这里边安装的是我们合约里引用的合约模板 以及合约模板里引用的工具包。contracts 下是放的自己编写的合约文件。scripts 文件夹下是自动生成的部署合约的脚本文件,执行这个下边的 js 文件也能实现部署合约。tests 里边自动编写了一些自动校验的测试文件。
@openzeppelin 向我们提供的ERC721 合约模板在contracts/MyToken.sol ,我们简单了解下这个合约的内容。
- 第 1 行是注释,会写一下这个代码所用的软件许可(
license),这里用的是MIT license。如果不写许可,编译时会警告(warning),但程序可以运行。solidity的注释由//开头,后面跟注释的内容(不会被程序运行)。 - 第 2 行声明源文件所用的
solidity版本,因为不同版本语法有差别。这行代码意思是源文件将不允许小于0.8.20版本或大于等于0.9.0的编译器编译(第二个条件由^提供)。Solidity语句以分号(;)结尾。 - 第 4-5 行是导入外部 
Solidity文件,导的Solidity文件和本身的Solidity文件相当于变成同一个Solidity合约。 - 第 7 行是创建合约(
contract),并声明合约的名字MyToken,is表示继承了引入的ERC721和Ownable合约。 - 第 8-10 行是在
constructor中我们传入了继承来的合约定义好的参数,为ERC721传入token的name和symbol,Ownable传合约拥有者的地址。 - 第 13-15 行是定义了
public对外开放的safeMint方法,需要传入类型为address的to参数和类型为uint256的tokenId,方法里执行ERC721.sol里引用的合约私有方法_safeMint(),并带入了参数to和tokenId。 
接下来我们就尝试,向合约模板里写入一些我们自定义的功能。