Solidity语法基础学习

十、实战项目(二):

3.项目实操:

ERC20 代币实战

①转账篇

总发行量函数

totalSupply() return(uint256)

·回传代币的发行总量

·使用状态变量uint256_totalSupply来储存

账户余额查询函数

Balance0f(address) returns(uint256)

·给定一个账户(address),回传该账户拥有的代币余额(uint256)

·使用mapping来储存:

  ·mapping(address => uint256) _balance;

转账函数

Transfer(address,uint256) returns(bool);

·呼叫者“msg.sender”,转移“amount”数量的代币给特定账户“to”

·成功时回传true,反之,回传false

·有些检查需要做:

  ·amount是否超过余额

  ·是否转移给address 0x0代表销毁的意思

转账事件

event Transfer(

    address indexed from,

    address indexed to,

    uint256 value,

);

·当发生代币转移时,必须触发此事件,即使转移的数量为“0”也是

②授权篇

授权余额查询函数

allowance(address owner,address spender) returns(uint256);

·给定两个账户(address),回传“owner”授权给“spender”的额度(uint256)

·使用mapping来储存:

  ·mapping(address =>

    ·mapping(address => uint256) _allowance;

注:mapping查询节省燃料

授权函数

approve(address spender,uint256 amount) returns(bool);

·呼叫者“msg.sender”,授权“amount”数量的代币额度给第三方账户“spender”

·成功时回传true,反之,回传false

授权事件

event Approval(

    address indexed owner,

    address indexed spender,

    uint256 value,

);

·当授权额度时,必须触发此事件,即使数量为“0”也要触发

③花别人的钱

从第三方账户转账的函数

transferFrom(address from,address to,uint256 amount);

·呼叫者(msg.sender)从代币持有者(from)转账给接收者(to)“amount”数量的代币

·其中:

  ·需检查呼叫者是否拥有足够的额度可用

  ·转账时要检查持有者是否足够的余额

  ·转账时需要同时减少额度

4.补充概念:

ERC20代币实战

元资料(metadata)

铸造(mint)与销毁(burn)篇

ERC20 Meta接口

Interface IERCMetadata{……}

interface IERC20Metadata{
function name() public view returns(string memory);
function symbol() public view returns(string memory);
function decimals() public view returns(uint8);
}

代币名称

function name() public view returns(string memory);

·回传一个字符,代表这个代币的名称

·储存是以string来保存

·通常在constructor的时候就给定

代币的简称/缩写/象征

function symbol() public view returns(string memory);

·回传一个字符串,代表这个代币的简称

  ·Ethereum(name)→ETH(symbol)

  ·Apple(name)→AAPL(symbol)

·储存时以string来保存

·通常在constructor的时候就给定

代币小数点位置

function decimals() public view returns(uint8);

·回传一个uint8,代表这个代币的小数点位置

·这个函数只用来显示用

  ·decimals=3,则balance=1234,在显示为1.234

·基本上代币都会把decimals设定为18

  ·这是因为最开始就是设计的18,后来因为人类天性,能抄就抄

  ·1ether=1018wei

  ·1token=1018uint => decimals=18

ERC20辅助函数

铸造(mint)与销毁(burn)

interface IERC20{
function mint(address account,uin256 amount);
function burn(address account,uint256 amount);
}

铸造新代币

function mint(address account,uint256 amount);

·铸造,即“无中生有”

·只有合约拥有者或者特殊权限的人才能呼叫

·他同时也是一种转账,由address 0x0转到目标账号(account)

·由于是转账,因此也要触发“Transfer”事件

销毁代币

function burn(address account,uint256 account);

·销毁,即“回归虚无”

·可以根据使用情况决定谁可以呼叫

  ·若只有合约拥有者可以呼叫,则通常会有account参数,用来销毁特定人的代币

  ·若任何人都可以呼叫,则不会有account参数,用来销毁特定人的代币

  ·若任何人都可以呼叫,则不会有account参数,主要目的是请求呼叫者(msg.sender)销毁自己的代币同时也是一种转账,由account/msg.sender转到address 0x0

·由于是转账,因此也要触发“Transfer”事件

Example:示例代码

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17; interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner,address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balance0f(address account) external view returns (uint256);
function allowance(address owner,address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool);
function transfer(address to, uint amount) external returns (bool);
function trnasferFrom(address from, address to, uint256 amount) external returns (bool);
} contract ERC20 is IERC20 {
uint _totalSupply;//定义一个数
mapping(address => uint256) _balance;//定义了一个账号
mapping(address => mapping(address => uint256)) _allowance;
//查询授权额度
function allowance(address owner, address spender) public view returns (uint256) {
return _allowance[owner][spender];//返回自己和第三方
} function _approve(address owner, address spender, uint256 amount) internal {
_allowance[owner][spender] = amount;
emit Approval(owner, spender, amount);
} //授权
function approve(address spender, uint256 amount) public returns (bool) {
_approve(msg.sender, spender, amount);
return true;
} //发行代币,启动最初代币
constructor () {
_balance[msg.sender] = 10000;
_totalSupply = 10000;
} function totalSupply() public view returns (uint256) {
//回传总发行量
return _totalSupply;
} function balance0f(address account) public view returns (uint256) {
//回传查询余额
return _balance[account];
} function _transfer(address from, address to, uint256 amount) internal {
uint256 myBalance = _balance[from];
require(myBalance >= amount,"No money to transfer!");//已经没钱转账了
require(to != address(0),"Transfer to address 0");//不准转账到地址0
_balance[from] = myBalance - amount;//我的账户总额计算
_balance[to] = _balance[to] + amount;//你的账户怎么计算
emit Transfer(from, to, amount);
} //实现转账功能
function transfer(address to, uint256 amount) public returns (bool) {
_transfer(msg.sender, to , amount);
return true;
} //检查额度花人家的钱
function trnasferFrom(address from, address to, uint256 amount) external returns (bool) {
uint256 myAllowance = _allowance[from] [msg.sender];
require(myAllowance >= amount,"ERROR:myAllowance < amount"); //我们允许的额度是否小于了他花的额度 _approve(from, msg.sender, myAllowance - amount);//花去以后是否允许的额度有减少
_transfer(from, to, amount);
//检查花销是否从原来账户转移到被授权者账户
return true;
}
}

区块链特辑——solidity语言基础(七)的更多相关文章

  1. 比原链CTO James | Go语言成为区块链主流开发语言的四点理由

    11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...

  2. Solidity语言基础 和 Etherum ERC20合约基础

    1. 类型只能从第一次赋值中推断出来,因此以下代码中的循环是无限的,  小. for (var i = 0; i < 2000; i++) { ... } --- Solidity Types ...

  3. 001/Go语言构建区块链(mooc)

    1.区块链发展与现状 视频地址:https://www.imooc.com/video/17452 注意: 比特币与以太坊最大的区别在于: 以太坊引入了对图灵完美智能合约的支持,人们可以将任何业务逻辑 ...

  4. 从Go语言编码角度解释实现简易区块链

    区块链技术 人们可以用许多不同的方式解释区块链技术,其中通过加密货币来看区块链一直是主流.大多数人接触区块链技术都是从比特币谈起,但比特币仅仅是众多加密货币的一种. 到底什么是区块链技术? 从金融学相 ...

  5. 以太坊区块链Java(EthereumJ)学习笔记:概述

    本系列文章介绍以太坊区块链基于Java语言的解决方案.通过介绍EthereumJ定义的主要模块和Class,希望为大家学习和使用EthereumJ提供一些帮助. 整体架构 以太坊的Java解决方案主要 ...

  6. 给本体ONT技术社区的第一封公开信-涉及到不少区块链技术知识

    给本体ONT技术社区的第一封公开信-涉及到不少区块链技术知识 共识是区块链的核心机制,在一系列的区块链的发展历史当中,PoW/PoS/BFT等系列的共识算法都在各自的应用场景发挥了不同作用.在本体的第 ...

  7. 区块链火爆,再不知道Golang就晚了

    Golang,也叫Go语言,是2009年刚刚被发发布的一门新语言. 区块链,是2019年我国提出的新战略. 一个不争的事实就是,大多数从事区块链开发的小伙伴都是用Golang,大多数招聘区块链技术工作 ...

  8. 我是如何从Java转型为Go区块链工程师

    我是如何从Java转型为Go区块链工程师 本文来自于一个比原链核心开发的陈述 前言 IT部落在加入比原链之前一直是做Java开发的,当初看到Go还有点犹豫,还怕过不了面试,结果是否掌握一门语言的考量确 ...

  9. 2019金融科技风往哪儿吹?蚂蚁金服联合20余家金融机构预测新年热点:5G、区块链上榜

    2019年,金融科技的风向标在哪里?哪些板块成新宠,哪些科技成潮流? 1月4日,蚂蚁金服ATEC城市峰会在上海举行.大会上,蚂蚁金服与20余家金融机构一起预测了2019年金融科技的发展. “未来金融会 ...

  10. VRF在区块链中的应用

    最近区块链领域流行了一种"怪病",许多区块链项目或者设计方案都加入了一个叫做VRFs的算法.那么, (1) 什么是VRFs? (2) VRFs在区块链中解决了什么问题? 本文旨在介 ...

随机推荐

  1. .net core Blazor+自定义日志提供器实现实时日志查看器

    场景 我们经常远程连接服务器去查看日志,比较麻烦,如果直接访问项目的某个页面就能实时查看日志就比较奈斯了,花了1天研究了下.net core 日志的原理,结合blazor实现了基本效果. 实现原理 自 ...

  2. 类的编写模板之简单Java类

    简单Java类是初学java时的一个重要的类模型,一般由属性和getter.setter方法组成,该类不涉及复杂的逻辑运算,仅仅是作为数据的储存,同时该类一般都有明确的实物类型.如:定义一个雇员的类, ...

  3. hadoop配置day01

    hadoop 安装jdk 配置文件: sudo vim /etc/profile 配置文件: export JAVA_HOME=/home/hadoop/jvm/jdk1.8.0_341 export ...

  4. Windows骚操作

    电脑常用的快捷键 键盘功能健:Tab.Shift.Ctrl.Alt.Windows.Enter.空格.上下左右健.CapsLock(大小写转换).NumLock(对小键盘控制开/关) 键盘快捷键:全选 ...

  5. 5、有一行电文,译码规律为: a ——> z b——> y c ——> x. 即把第一个字母变成第26个字母, 第i个字母变成第(26-i+1)个字母, 非字母字符不变

    /* 有一行电文,译码规律为: a --> z b--> y c --> x. 即把第一个字母变成第26个字母, 第i个字母变成第(26-i+1)个字母, 非字母字符不变 */ #i ...

  6. 【云原生 · Docker】Docker简介及基本组件

    [云原生·Docker]Docker简介及基本组件 1.Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linu ...

  7. 【DL论文精读笔记】Object Detection in 20 Y ears: A Survey目标检测综述

    目标检测20年综述(2019) 摘要 Abstract 该综述涵盖了400篇目标检测文章,时间跨度将近四分之一世纪.包括目标检测历史上的里程碑检测器.数据集.衡量指标.基本搭建模块.加速技术,最近的s ...

  8. 前后端结合解决Excel海量公式计算的性能问题

    背景 在数据密集的业务领域,尤其是金融,保险,税务等行业中,经常需要利用Excel模型,来对业务进行分析和处理.例如: 1.金融投资: 根据模型进行估值计算,并对投资风险进行评估,通过测算出投资的内部 ...

  9. 动态规划篇——DP问题

    动态规划篇--DP问题 本次我们介绍动态规划篇的DP问题,我们会从下面几个角度来介绍: 区间DP 计数DP 树状DP 记忆化搜索 区间DP 我们通过一个案例来讲解区间DP: /*题目展示*/ 题目名: ...

  10. hexo-gitalk-评论自动初始化

    第一步 申请Personal Access Token 从 Github 的 Personal access tokens 页面,点击 Generate new token 第二步 安装项目依赖 np ...