文章目录

  • 前言
    • 警告
  • 完善项目结构
  • 编写合约代码
  • 编译合约
  • 部署合约
  • 总结
  • 捐赠渠道

前言

智能合约为数字藏品提供技术支持,它可以定义数字藏品的简称、全称、发行数量、铸造方法、版权税等等,所有关于数字藏品的现实信息都离不开智能合约。

这篇教程我们开始编写智能合约,智能合约标准我们使用的是ERC-721(非同质化代币),接着使用HardHat来编译,编译是为部署到区块链上做准备,最后我们会把智能合约部署到Rinkeby测试网络上。

警告

本指南仅供学习交流使用,不得用于违法用途,如果侵犯了国家法律,责任自负。

完善项目结构

为了让我们的项目看起来有迹可循,需要在我们的项目根目录下创建两个文件夹,一个文件夹存放智能合约代码,一个文件夹存放执行合约相关任务的脚本文件,使用cmd命令进入项目根目录,然后输入命令

mkdir contracts

按下回车键执行命令

mkdir scripts

按下回车键执行命令
contracts将存放合约代码文件,scripts将存放执行合约的脚本文件

编写合约代码

选择一款编辑器打开项目文件夹my-contract,在contracts文件夹下新建个文件,名字叫MyContract.sol,下边是我们的合约代码,我们使用了OpenZeppelin的ERC-721标准库,复制并粘贴到你的MyContract.sol文件

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract MyContract is ERC721URIStorage {using Counters for Counters.Counter;Counters.Counter private currentTokenId;constructor() ERC721("OAXTOKEN", "OAX") {}function mintTo(address recipient, string memory tokenURI)publicreturns (uint256){currentTokenId.increment();uint256 newItemId = currentTokenId.current();_safeMint(recipient, newItemId);_setTokenURI(newItemId, tokenURI);return newItemId;}
}

看起来有点难以理解?别慌,让我们一行接着一行看下去。

  • 第一行我们定义了使用的Solidity(智能合约语言)版本号。
  • 接下来从第4-6行引入了三个openzeppelin的关键类文件,来快速实现ERC-721的标准,而不需要我们再自己去一行一行的写合约代码。
    ERC721.sol,包含了实现以太坊ERC-721标准的所有方法,我们的合约将会继承它,这样就保证了我们的合约是有效的。
  • Counters.sol,提供计数器,只能递增或递减一次。我们的智能合约使用一个计数器来跟踪铸造的数字藏品总数,并在我们的新数字藏品上上设置唯一的ID。(使用智能合约创建的每个数字藏品都必须分配一个唯一的ID,我们的唯一ID仅由存在的NFT总数决定,例如,我们使用智能合约创建的第一个的ID为“1”,第二个的ID就是“2”,等等。)
  • ERC721URIStorage,为我们提供了公共方法setTokenURI来设置每个藏品对应的元数据信息,从而让我们的数字藏品有了现实意义,比如一张门票、一个视频、一张画。
  • 下边就是我们合约代码的正文了,只有一个计数器(currentTokenId),一个构造函数方法(constructor),和一个铸造方法(mintTo)。构造函数共有两个变量,第一个是我们数字藏品的全称(OAXTOKEN),第二个是简称(OAX),给你的数字藏品起一个你喜欢的全称和简称,改动这两项就可以。铸造方法也有两个变量,第一个是个以太坊地址,用以接收将要铸造成的藏品,第二个是元数据信息,一般的做法是设置一个网址,网址里存储信息,设置完成这两个参数后,会返回藏品的唯一ID给调用者。

在写完合约代码后,我们的项目结构会是这个样子

编译合约

在编译合约前,请你确保按照第二篇教程已经完成所有配置,我们需要更新hardhat.config.js,代码如下,复制粘贴到你的文件里。

/*** @type import('hardhat/config').HardhatUserConfig*/require('dotenv').config();
require("@nomiclabs/hardhat-ethers");
const { API_URL, PRIVATE_KEY } = process.env;module.exports = {solidity: "0.8.1",defaultNetwork: "rinkeby",networks: {hardhat: {},rinkeby: {url: API_URL,accounts: [`0x${PRIVATE_KEY}`]},ethereum: {chainId: 1,url: API_URL,accounts: [`0x${PRIVATE_KEY}`]},},
}

通过设置配置项,我们定义了编译合约的solidity版本,区块链网络类型,接口地址和付费的地址私钥。
现在我们只需要执行编译命令就可以了,打开项目根目录my-contract,输入以下命令

npx hardhat compile

如果命令运行正常,会有如下提示

C:\Users\ThinkPad\my-contract>npx hardhat compile
Compiling 1 file with 0.8.1
Solidity compilation finished successfully

部署合约

最后一步就是把合约部署到区块链网络上,我们需要使用javascript写一个简单的部署脚本,然后使用HardHat运行它。
在scripts目录下,新建文件deploy.js,复制下边代码到文件中

async function main() {const [deployer] = await ethers.getSigners();const NFT = await ethers.getContractFactory("MyContract");await NFT.deploy();console.log('合约地址:',NFT.address);
}
main().then(() => process.exit(0)).catch((error) => {console.error(error);process.exit(1);});

部署脚本将会从MyContract.sol拿到编译过的合约代码,然后部署到网络上,如果部署成功我们会看到部署后的合约地址。
在项目根目录下,使用HardHat执行部署脚本

npx hardhat --network rinkeby run scripts/deploy.js
C:\Users\ThinkPad\my-contract>npx hardhat --network rinkeby run scripts/deploy.js
合约地址: 0x116Ca6682A03547BffF8Fa8E12Efd301872a1383

复制合约地址到以太坊rinkeby区块浏览器去查看刚才我们部署的合约,如果可以查到恭喜你,顺利为你的数字藏品部署了智能合约。

总结

目前为止,我们完成了智能合约的编写、编译、部署,在下篇教程里我们会开始铸造我们的数字藏品,方法是通过调用合约的mintTo方法,与此同时使用IPFS(去中心化的文件存储)绑定元数据到每个铸造出的数字藏品。

捐赠渠道

本教程是由本人自发的项目,如果你要支持我,请通过支付宝发送口令红包,将口令发送到我的邮箱351107490@qq.com,捐赠仅凭个人意愿,感谢支持。

数字商品指南系列第三篇:编写智能合约并编译部署相关推荐

  1. 数字藏品指南系列第五篇:验证智能合约

    文章目录 前言 警告 获取智能合约完整代码 验证合约 总结 捐赠渠道 前言 在以太坊区块浏览器上验证智能合约有很多好处: 作为合约的创建者,它可以提升我们的开发体验,因为对于验证通过的智能合约,浏览器 ...

  2. [深度][PyTorch] DDP系列第三篇:实战与技巧

    [深度][PyTorch] DDP系列第三篇:实战与技巧 转自:https://zhuanlan.zhihu.com/p/250471767 零. 概览 想要让你的PyTorch神经网络在多卡环境上跑 ...

  3. 深入理解javascript作用域系列第三篇

    前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javascript作用域系列第三篇--声明提升(hois ...

  4. javascript面向对象系列第三篇——实现继承的3种形式

    前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.开宗明义,继承是指在原有对象的基础上,略作修改,得到一个新的对象.javascript主要包括类式继承.原型继承和拷贝继承这三种 ...

  5. 迈克尔逊干涉仪仿真程序_如何使用迈克尔逊编程语言在Tezos上编写智能合约

    迈克尔逊干涉仪仿真程序 这是(第1部分):迈克尔逊入门:Tezos的脚本语言 迈克尔逊必须是目前智能合约中最令人兴奋的编程语言之一. 这是一种基于堆栈的严格类型化语言,其中编写了智能合约以确保Tezo ...

  6. 如何编写智能合约(Smart Contract)(III)最新

    写在前面 参考原文:http://liyuechun.org/2017/09/21/how-to-code-smart-contract-BloggerCoin/有版本问题,按照原文会出错 最新: h ...

  7. 以太坊智能合约开发第七篇:智能合约与网页交互

    原文发表于:以太坊智能合约开发第七篇:智能合约与网页交互 上一篇中,我们通过truffle开发框架快速编译部署了合约.本篇,我们将来介绍网页如何与智能合约进行交互. 编写网页 首先我们需要编写一个网页 ...

  8. 如何编写智能合约(Smart Contract)?(II)建立加密代币

    如何编写智能合约(Smart Contract)?(II)建立加密代币 接着上一篇如何编写智能合约(Smart Contract)?,本篇文章,我们将写一个简单的加密代币的智能合约来给大家诠释加密代币 ...

  9. 三:将智能合约部署到ganache测试网

    三:将智能合约部署到ganache测试网 文章目录 三:将智能合约部署到ganache测试网 实验目的 实验原理 开始条件 实验过程 实验步骤 相关官方知识库 下一章内容: 实验目的 掌握将智能合约部 ...

最新文章

  1. linux停止ftp服务命令,centos没有service命令,怎么启用ftp服务
  2. 2003配置php环境,2003配置PHP环境(有利于升级)
  3. cocurrent包semaphore信号量
  4. 碉堡!Mysql8.0竟然可以直接操作json文档了。。。
  5. hive 导出json格式 文件_hive存储json格式文件
  6. 基于云存储网关的Veeam备份归档上云方案
  7. 【Antlr】Antlr preview 不能使用了
  8. 洛谷P3402 【模板】可持久化并查集
  9. 命令行管理sql server
  10. 最大流算法 - 标号法
  11. php ftps,使用PHP Curl的FTPS获得部分下载
  12. android 自定view 网状结构图
  13. 安利一个超好用的录屏工具,收藏必备! - 网课、游戏、录音等免费录制
  14. .md文件是什么?.md如何打开?怎么打开?
  15. 如何获取ffmpeg返回的错误信息
  16. eos采用的共识机制是_EOS共识机制详解
  17. 卫生纸玫瑰花折法5步_餐巾纸折纸玫瑰花的折法图解教程
  18. 使用雪碧图Css Sprite精灵 | 加速网页响应速度
  19. 项目预告!根据游戏实现效果逆推代码,用C++重现FGo式战斗逻辑
  20. python返回上级_python 获取当前,上级,上上级路径(任何上级路径)

热门文章

  1. AES算法在Wi-Fi加密中的应用
  2. 【舍友计划】恶搞~让计算机变卡变慢
  3. html中如何淡化背景图片,excel怎么去除背景图片
  4. [笔记分享] [Camera] 相机的等效焦距计算
  5. Conflux CTO伍鸣博士应邀出席金色沙龙
  6. win10 1809版本手动安装WSL和ubuntu 18.04
  7. 微型计算机 2018 12月下,桌面CPU天梯图2018年12月最新版 十二月台式电脑处理器排名...
  8. 如何观察一棵树 - 笔记
  9. [ICCV 2019] Few-Shot Learning with Global Class Representations
  10. 【labelCloud标注软件的使用】