# 初识 Solidity 和 OpenZeppelin **Published by:** [icepy](https://paragraph.com/@icepy/) **Published on:** 2022-03-18 **URL:** https://paragraph.com/@icepy/solidity-openzeppelin ## Content 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 提供的合约,而不是重头开始重写整个标准。https://github.com/OpenZeppelin/openzeppelin-contracts在 useweb3 项目中安装 openzeppelin-contracts$ npm install @openzeppelin/contracts --save ERC-20ERC-20 是一个标准,它描述了一套技术规范,OpenZeppelin 依赖标准实现了 ERC-20 的标准合约。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 721ERC-721 是一个标准,它描述了一套技术规范,OpenZeppelin 依赖标准实现了 ERC-721 的标准合约。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 的实现相同 ## Publication Information - [icepy](https://paragraph.com/@icepy/): Publication homepage - [All Posts](https://paragraph.com/@icepy/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@icepy): Subscribe to updates - [Twitter](https://twitter.com/i_icepy): Follow on Twitter