初识 Solidity 和 OpenZeppelin
March 18th, 2022

Solidity 是一种面向对象的高级静态语言,用于实现智能合约,运行于 以太坊虚拟机,它支持继承,库和自定义类型等。

pragma solidity ^0.8.0;

contract HelloWorld {

}

Solidity 有三种类型的变量,熟悉它是因为变量的范围是由它们声明的位置所决定的:

  • Local
    • 在函数内部声明且不存储在区块链上
  • State
    • 存储在区块链上
  • Global
    • 提供区块链相关的信息,它在运行时由以太坊虚拟机注入
    • 包括交易发送者,区块时间戳,区块哈希等
    • 全局变量

语法知识,请阅读:https://docs.soliditylang.org/en/v0.8.9/index.html

初识 OpenZeppelin

说明:OpenZeppelin 是一家以太坊安全公司,其为流行的智能合约标准开发了一组合约,这些合约经过了大量的测试和安全审查,所以如果我们需要实现这些标准合约时,应该尝试找到 OpenZeppelin 提供的合约,而不是重头开始重写整个标准。

在 useweb3 项目中安装 openzeppelin-contracts

$ npm install @openzeppelin/contracts --save

ERC-20

ERC-20 是一个标准,它描述了一套技术规范,OpenZeppelin 依赖标准实现了 ERC-20 的标准合约。

假设我们使用 ERC-20 标准创建一个游戏经验值的合约,阅读文章获取经验值 XP

// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.4;

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

import "hardhat/console.sol";

contract UseWeb3XP is ERC20 {
  constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol){
    _mint(msg.sender, 10 * 10 ** 18);
  }
}

语法解释:is 是 solidity 的继承

本质上在创建智能合约时构造函数,需要来自用户输入的两个参数,_name 代表名称,_symbol 代表符号

由于是继承的关系,因此在构造函数初始化时也需要初始化父合约的构造函数

_mint 函数只能被合约本身调用,而不能被外部调用

msg 是由以太坊注入的全局变量,sender 也就是发送者的地址

重要的问题在于 Solidity 不能支持浮点数,因此这里需要做一些处理。作为替代方案,我们将单位表示为相对此单位的最小不可分割的数量,ERC 20 默认情况下使用 18位小数,因此一个完整的 XP 表示为 10 ^ 18。

ERC 721

ERC-721 是一个标准,它描述了一套技术规范,OpenZeppelin 依赖标准实现了 ERC-721 的标准合约。

假设我们使用 ERC-721 标准创建一个头像集合

// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.4;

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

contract UseWeb3Avatar is ERC721 {
  constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol){
    _mint(msg.sender, 1);
  }
}

说明:语法解释与上述 ERC-20 的实现相同

Subscribe to icepy
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from icepy

Skeleton

Skeleton

Skeleton