# 初识 Solidity 和 OpenZeppelin

By [icepy](https://paragraph.com/@icepy) · 2022-03-18

---

Solidity 是一种面向对象的高级静态语言，用于实现智能合约，运行于 [以太坊虚拟机](https://coinmarketcap.com/alexandria/glossary/ethereum-virtual-machine-evm)，它支持继承，库和自定义类型等。

    pragma solidity ^0.8.0;
    
    contract HelloWorld {
    
    }
    

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

*   Local
    
    *   在函数内部声明且不存储在区块链上
        
*   State
    
    *   存储在区块链上
        
*   Global
    
    *   提供区块链相关的信息，它在运行时由以太坊虚拟机注入
        
    *   包括交易发送者，区块时间戳，区块哈希等
        
    *   [全局变量](https://docs.soliditylang.org/en/v0.8.9/units-and-global-variables.html)
        

语法知识，请阅读：[https://docs.soliditylang.org/en/v0.8.9/index.html](https://docs.soliditylang.org/en/v0.8.9/index.html)

初识 OpenZeppelin
---------------

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

*   [https://github.com/OpenZeppelin/openzeppelin-contracts](https://github.com/OpenZeppelin/openzeppelin-contracts)
    

在 useweb3 项目中安装 openzeppelin-contracts

    $ npm install @openzeppelin/contracts --save
    

### ERC-20

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

*   [https://docs.openzeppelin.com/contracts/4.x/erc20](https://docs.openzeppelin.com/contracts/4.x/erc20)
    

假设我们使用 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 的标准合约。

*   [https://docs.openzeppelin.com/contracts/4.x/erc721](https://docs.openzeppelin.com/contracts/4.x/erc721)
    

假设我们使用 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 的实现相同

---

*Originally published on [icepy](https://paragraph.com/@icepy/solidity-openzeppelin)*
