本文将介绍Solidity开发中的两种工具:Remix IDE和Hardhat

Remix

  • Solidity在线编译器
  • 无需安装可快速开发、部署和测试Solidity智能合约
  • 支持插件,包括OpenZeppelin,Oraclize和Solium等
  • 可以本地安装,使用命令行操作,完全开源

Remix部署ERC-721合约

进入Remix,创建OpenZeppelinERC721.sol

插入以下代码

pragma solidity ^0.8.0;import "https://github.com/OpenZeppelin/OpenZeppelin-contracts/blob/master/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol";

修改要部署的合约,注意必须部署主合约。若选择部署接口合约系统会报错。


点击部署,确认交易,合约部署成功后即可对已部署的合约进行交互

当成功调用mint函数时,成功铸造一个NFT,此时totalSupply字段由0变为1

Chainlink预言机的介绍及其喂价演示

什么是预言机

  • 是一种抽象电脑,用来回答决定性问题
  • 区块链预言机是为链上智能合约提供链下信息的服务
  • 为区块链网络提供直接获取链外的信息的途径

Chainlink

  • 去中心化区块链预言机协议
  • 最初基于Ethereum,现在已经有12+条L1和L2链有原生部署
  • 最主要的应用场景之一是为各类DeFi智能合约提供喂价

智能合约喂价基本原理

  • 预言机节点向Aggregator合约发布价格数据,并获得奖励
  • Aggregator合约从预言机网络定期接受最新数据更新,并将数据聚合并存储上链
  • 终端用户通过Aggregator接口或通过代理合约的Consumer接口使用只读操作检索喂价

Remix演示

创建AggregatorInterface.sol,写入一下代码

pragma solidity ^0.8.0;interface AggregatorV3Interface {/** * Returns the decimals to offset on the getLatestPrice call */function decimals() external view returns (uint8);/** * Returns the description of the underlying price feed aggregator */function description() external view returns (string memory);/** * Returns the version number representing the type of aggregator the proxy points to */function version() external view returns (uint256);/** * Returns price data about a specific round */function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);/** * Returns price data from the latest round */function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);}

以下是喂价地址

#Moonbase AlphaBTC to USD0xCf88A8d7fc1A687895fC8ffAad567f303926B094ETH to USD0x3669da30c33D27A6A579548fCfc345fE5dEdda6eDOT to USD0xA873F6b30aD79fCAF9b03A0A883d6D1f18D661d7KSM to USD0x0C515E77897b2A7181C875c88FaF9BC8E5661E3bAAVE to USD0x64B22D2B8c3CA311a0C2de34bf799f8101c89362ALGO to USD0x9fc3b0BF1156868085AFC1cFf4Bf6D85ea301371BAND to USD0xC5aeD933FEb49794A8Bf2FB0e73D9c958c8a07baLINK to USD0x446b93236B4d34642732B8dcbeB3cb4f4FA03C70SUSHI to USD0x4a6Cf10C0f5c4D4e7cf7385bFfecDAec0778357CUNI to USD0x326997c21451DaB916F9f01684991B6169dAf3E5

如图,decimals为小数点在answer的位数,即20605.82224916

因此,使用Chainlink预言机可以实时获取链下数据实现链上链下协同。

HardHat

  • 是一个编译,部署和测试Solidity智能合约和应用的开发环境
  • 自带一个本地EVM虚拟机运行环境 – Hardhat Network,类似于Ganache
  • 可以自定义任务来简化开发工作流程
  • 基于JavaScript,也支持TypeScript
  • 支持各种插件,包括Etherscan插件,Waffle插件,Ganache插件等等

安装Hardhat

# 安装和初始化命令# 创建目录mkdir hardhat && cd hardhat# 初始化Node.js项目npm init -y# 安装Hardhatnpm install hardhat# 创建项目npx hardhat# 安装ethers插件npm install @nomiclabs/hardhat-ethers ethers# 安装OpenZeppelin依赖npm install @openzeppelin/contracts## 发现安装进程卡住不动,可以配置npm代理(设置淘宝镜像)来提高下载速度npm config set registry https://registry.npm.taobao.org

Hardhat部署和交互ERC-20合约

## 部署合约# 编译合约npx hardhat compile# 部署合约npx hardhat run --network moonbase scripts/deploy.js

## 交互合约# 开启Hardhat Consolenpx hardhat console --network moonbase# 获得合约ABI示例const MyToken = await ethers.getContractFactory('MyToken');# 关联到之前部署的合约地址const mytoken = await MyToken.attach('your-deployed-contract-address');console.log(mytoken)await mytoken.name()await mytoken.totalSupply()# 查询余额await mytoken.balanceOf("the-deployer-wallet-address")# 转账await mytoken.transfer("recipient-wallet-address", 1000000)# 查询余额await mytoken.balanceOf("the-recipient-wallet-address")


在Moonbase α的testnet上也能查询到相关Transaction Details

Remin IDE vs. Hardhat

HardhatRemix IDE
运行模式本线命令行/CLI线上/浏览器
可纳入其他项目依赖YN
包含编辑器NY
支持任务和自动化流程YN
支持单元测试通过Waffle插件有限