solidity实现智能合约教程(1)-ERC20合约

2023-11-23 18:50

本文主要是介绍solidity实现智能合约教程(1)-ERC20合约,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 介绍
  • 2 主要功能
  • 3 代码示例
  • 4 部署测试

猛戳订阅学习专栏🍁🍁 👉 solidity系列合约源码+解析 👈 🍁🍁

在这里插入图片描述

1 介绍

ERC-20是一项以太坊代币标准,是从EIP-20提案经过以太坊社区不断讨论验证后通过而来的,是由Vitalik Buterin于2015年提出,是以太坊的第20号代币标准。
在这里插入图片描述
截止到我开始写本篇文章,以太坊上已存在536259种erc20代币合约,也就意味着共发行了这么多种erc20代币。

2 主要功能

ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如:

  • 设定代币名称
  • 设定代币总量
  • 规定小数点位数
  • 规范如何批准代币交易
  • 如何访问数据
  • 允许查看各地址中erc20代币数目以及代币总量
  • 一定条件下,允许第三方账户使用某账户中的代币资产
  • 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容
    以及一些简单的函数功能等等。

我们先来看一下标准的 ERC20 标准的接口:

// SPDX-License-Identifier: MITpragma solidity ^0.8.0;interface IERC20 {event Transfer(address indexed from, address indexed to, uint256 value);event Approval(address indexed owner, address indexed spender, uint256 value);function name() constant returns (string name);function symbol() constant returns (string symbol);function decimals() constant returns (uint8 decimals);function totalSupply() external view returns (uint256);function balanceOf(address account) external view returns (uint256);function transfer(address to, uint256 amount) external returns (bool);function allowance(address owner, address spender) external view returns (uint256);function approve(address spender, uint256 amount) external returns (bool);function transferFrom(address from,address to,uint256 amount) external returns (bool);
}

下面我们解释一下上述每个接口函数的作用:

  • event Transfer(address indexed from, address indexed to, uint256 value): 转账事件,当发生转账操作时该event会被触发。所谓事件,其本质是记录的日志,当转账事件发生时,外界是无法监听相关数据的,即不知道转账发生了,此时的解决方法便是利用事件,将信息记录起来,外界通过监听事件来判断合约做了什么,因为事件本身的作用与目的,发送事件也被称为广播事件。

  • event Approval(address indexed owner, address indexed spender, uint256 value); 授权事件,当执行approve操作时该event会被触发。

  • name (): 返回 string 类型的 ERC-20 代币的名称

  • symbol (): 返回 string 类型的 ERC-20 代币符号,可以理解为代币的简称

  • decimals (): 当前代币支持几位小数,如果为 3,则支持 0.001 粒度的代币。在智能合约里,其实是不存在小数的,而是通过 unit256 来存在,deciaml 用于表示 uint256 存储的值中有几位代表小数,常见的合约decimals为18。

  • totalSupply (): 代币总发行量

  • balanceOf(address account): account 地址中代币的余额

  • transfer(address to, uint256 amount): 转账函数,假设地址 A 调用了 transfer 函数,则表示将地址 A 中amount 个 token 转给地址to

  • approve(address spender, uint256 amount): 授权函数,允许spender 地址从自己的账户地址中转移amount 个 token(很多钓鱼网站使用的函数)

  • allowance(address owner, address spender) 返回spender 地址还能从owner 地址中提取多少 token,当合约通过 approve 函数获得某地址授权后,默认是可以转移该地址中所有的 token 的。

  • transferFrom(address from,address to,uint256 amount): 转账函数,与 approve 函数搭配使用,通过 approve 函数获得from 地址的授权,授权对象是当前调用 transferFrom 函数的合约地址,此时合约便可以转移from 地址中的amount 个 token 到to 地址中

ERC-20 标准中,transfer、approve、transferFrom 这三者是比较容易搞混的函数,这里简单解释一下:

transfer(address to, uint256 amount) 是单纯的转账,假设账户 A 调用了 transfer 函数给账户 B 转账,形式为:transfer (B, 100),该函数的会检查 A 地址中是否有 100 个相关代币,如果有,则将 100 个代币转到 B 地址中。

transferFrom(address from,address to,uint256 amount)是替别人转账,假设账户 A 中有 100 个代币,账户 A 同样想转给账户 B,但他不想直接转,此时便出现了账户 C(通常是一个合约),合约 C 会通过 approve 函数获得操作账户 A 中代币的授权,然后合约 C 通过 transferFrom 函数将账户 A 中的 100 个代币转移给账户 B。

你可能会疑惑,转账为啥要还要引入合约 C 这个第三方?直接用 transfer 函数转账不行吗?

只使用 tranfer 函数进行转账是没有问题的,但并不能满足所有的情况,比如 DeFi 的各种借贷应用,本质还是将账户 A 的代币转给账户 B,但账户 A 之所以会借是因为有借出去的代币可以产生利息收益,这个功能就需要一个独立于账户 A 与账户 B 之外的合约 C 来实现,比如 Uniswap 就会获取你账户中代币的操作权限。

这些复杂的业务场景我们在后面的文章中会有相应的合约示例讲解。

3 代码示例

在实际的合约开发中我们并不需要去实现每一个方法,因为现在已经有很多开源的智能合约库帮我们实现了基本的方法,而且他们实现的合约代码都经过了权威审计单位的审计,比我们一个个去实现要安全许多,我们就没必要重复造轮子了,要学会站在巨人的肩膀。

本篇文章使用到的智能合约开发库:
openzeppelin
有兴趣的同学可以去看一下他们的源码。

下面让我们来写一个基础的ERC20合约:

// SPDX-License-Identifier: MIT;pragma solidity 0.8.7;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract Erc20T is ERC20{constructor(uint _totalSuperNum) ERC20("T test","T") {_mint(msg.sender,_totalSuperNum);}}

是的,你没有看错,就单单使用了一个构造方法我们就实现了一个ERC20代币合约,下面让我们来看一下传入的相关参数:

  • _totalSuperNum :为合约部署时要传入的铸造代币的数量
  • T test : 为合约部署后产生代币的名称
  • T :为合约部署后产生代币的简写,也就是代币符号(类似USDT)

4 部署测试

在这里插入图片描述

可以分别查看合约部署代币的名称、简写、总量、相应地址的代币余额等。。。
在这里插入图片描述

好了,我们solidity实现智能合约教程的ERC20篇就到此结束了,后面会更新更加复杂业务类型的合约,欢迎关注~

这篇关于solidity实现智能合约教程(1)-ERC20合约的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/419997

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P