Web3 叙述交易所授权置换概念 编写transferFrom与approve函数
前文
Web3带着大家根据ERC-20文档编写自己的第一个代币solidity智能合约
中 我们通过ERC-20一种开发者设计的不成文规定 也将我们的代币开发的很像个样子了
我们打开 ERC-20文档
我们transfer后面的函数就是transferFrom

这个也是 一个账号 from 发送给另一个账号 to 数量 value
他是一个不成文规定
transfer取的是 msg.sender 意思是 谁操作触发了这个函数 from 就代表谁
而 transferFrom 则是 我们之后交易所来调用的
也就说是 你授权的交易所 就会有能力通过调用 transferFrom 转走你授权数量的代币
所有授权 相对来说还是个较为危险的操作
那么 也就是说 approve 是调用transferFrom的基础 你要先授权

approve方法的话 你可以授权多个机构 例如 你的代币 10000 你可以授权 A机构 3000 B机构 3000
C机构 3000 但当你操作授权后真的会有这么多代币进入 A B C机构中 不然别人怎么用呢?
被授权后他就有这个额度的使用权
你也可以 简单理解为 我们分配给银行 你可以自己留在手里 或者 放在银行里
例如 给ABC银行各3000代币,都是一年定期,在这个期间中 银行对你的代币是有一个支配权的。在这一年中你的代币怎么被流通,你是不知道的,反正到最后能把钱取出来就完事了。
然后,之前被我们比作银行的交易所,他们就会发布订单,例如 你愿意用 1000GRtoken 换 1 ETH吗?
如果此时 我们操作愿意
这里 就像买一个商品一样,此时 A交易所的代币就会少一千,但你的账号就会多1ETH
所以 之后 我们就要用 模拟出来的区块链环境账号 分配给 ABC三个交易所 一定数量的代币 然后 在ABC交易所中就会有对应的订单池
在这个池子中 就会有别人创建的订单
你就可以看合不合适 如果合适 就直接下单
当然 这一块 光看描述 确实换谁来了都没那么好理解
还是先通过代码 将方法创建好
这里这个approve函数 我们直接整个复制过来

直接放到我们自己的这个代币合约上去
函数的一个专属花括号 我们还是得自己加一下

这个方法 有三个重要的值
第一个是 msg.sender 这个要取当前登录的用户
这个参数 代表当前登录的用户 因为 肯定要用户来和交易所授权给定代币
然后 就是这个函数中的两个参数 _spender 交易所的地址 _value 给定授权的代币数量
但 approve中还需要像一个 js对象一样的数据结构
例如这样
{a机构: 300,b机构: 400
}
机构对应授权代表数量
但在solidity中对象显然不是这样的
我们先要定义一个对象
mapping(address => mapping(address=>uint256)) public allowance;
这里 我们定义 一个 mapping 对象 键对应的值 又是一个对象类型 然后 这里面这个对象 键对应的值 是一个uint256数字类型的 然后 public 表示这是一个公共的 变量名叫 allowance

然后 我们编写approve方法如下
function approve(address _spender, uint256 _value) public returns (bool success) {require(_spender!=address(0));allowance[msg.sender][_spender] = _value;return true;
}
这里 我们先用require判断_spender 交易所的地址是否有问题 当然这里只是个很弱的判断
address(0) 就类似于 null只是这个类型的 空 相当于这是个非空的格式判断
然后 在我们刚刚创建的allowance 下键为msg.sender下的键为_spender的值 复制微 对应 value
例如 当前登录的账号是 t1 在allowance 下找到键等于t1 下的一个对象 然后在这个对象中找到 和操作的交易所相同的键 将value赋值上去
数据结果或许可以理解为这样
{t1用户: {A交易所: 1000}
}
当然这是一个js的展现形式 方便大家理解
然后 返回了一个ture 因为 这个函数设置了returns (bool success) 要求返回一个布尔类型的值
这里需要强调一下require的好处 除了会将错误日志记录在区块链的日志中
还可以规避燃料费无故消耗
如果中间错误 你用的require 执行不成功 燃料费会退回
approve在官方文档中介绍 还要触发一个Approval事件

我们直接整个复制到自己的合约上

直接在approve函数中 返回true之前 调用一下
emit Approval(msg.sender,_spender,_value);

这里 我们传入 当前账号 交易所地址 数量
好啦 那么 approve这个授权的方法都写好了 那么 自然我们前面说的 transferFrom 就可以开始了
先从文档中拿过来

花括号自己加一下
这个方法是被授权的交易所来调用的
而 这里三个参数 _from 付款账号 _to 收款账号 _value 数量
而在这个方法中 msg.sender拿到的是调用这个方法的交易所地址
但是这里有个问题 我们要将transfer改一下
我们改成

这里 我们直接将transfer原本的逻辑 抽离成一个_transfer函数
这样方便外界调用
这样 我们就可以这样写 transferFrom
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value);_transfer(_from,_to,_value);return true;
}
这里 我们现在allowance中 找到 付款账号对应对象下的 交易所对应下的值的 value 调用sub将他减去
然后 我们两个账号之间的转入 我们直接用刚刚拆出来的 _transfer 就好了
因为 如果你不拆
原本那种用msg.sender的
msg.sender拿到的不是 付款账号 而是交易所地址 因为transferFrom是交易所调用的 然后 transferFrom中调用的_transfer 所有 你如果取msg.sender 取到的是交易所
当然 这前面还是得加个判断 如果你授权给交易所的代币都不大于value 那么 交易肯定是没办法执行的

我们在合约中写的这两个对象 可以理解为 他们是一个变量 但其实 在去中心化的区块链中 他们就是数据库存储 他们将数据挂到了区块链上

且这种数据也不能随意更改 公开透明的
相关文章:
Web3 叙述交易所授权置换概念 编写transferFrom与approve函数
前文 Web3带着大家根据ERC-20文档编写自己的第一个代币solidity智能合约 中 我们通过ERC-20一种开发者设计的不成文规定 也将我们的代币开发的很像个样子了 我们打开 ERC-20文档 我们transfer后面的函数就是transferFrom 这个也是 一个账号 from 发送给另一个账号 to 数量 val…...
Redis系列二:Clion+MAC+Redis环境搭建
1. ClionMACRedis-3.0-annotated环境搭建 参考: https://github.com/huangz1990/redis-3.0-annotated https://gitee.com/dumpcao/redis-3.0-annotated-cmake-in-clion https://tool.4xseo.com/a/12910.html 1.1 下载并导入Clion git clone https://gitee.com/dum…...
Linux下 Docker容器引擎基础(2)
目录 创建私有仓库 将修改过的nginx镜像做标记封装,准备上传到私有仓库 将镜像上传到私有仓库 从私有仓库中下载镜像到本地 CPU使用率 CPU共享比例 CPU周期限制 CPU 配额控制参数的混合案例 内存限制 Block IO 的限制 限制bps 和iops 创建私有仓库 仓库&a…...
现场服务管理系统有哪些?5个现场服务管理软件对比
现场售后服务管理软件的使用者通常是机械设备、家电、仪表仪器、医疗器械等厂商的工程师和客服调度人员。现场售后服务管理软件可将服务过程标准化,包括工单派发、服务过程步骤、配件订购出货和付款、客户评价都有系统支持,有的现场售后服务软件还支持数…...
leetcode 912.排序数组
⭐️ 题目描述 🌟 leetcode链接:排序数组 思路: 此题如果使用冒泡插入选择这些时间复杂度 O ( N 2 ) O(N^2) O(N2) 的算法会超时,使用快排 优化也过不去,因为里面有一个测试用例全是 2 即使加了三数取中也会是 O (…...
利用MMPreTrain微调图像分类模型
前言 MMPreTrain是一款基于PyTorch的开源深度学习预工具箱,是OpenMMLab项目的成员之一MMPreTrain的主要特性有: 支持多元化的主干网络与预训练模型支持多种训练策略(有监督学习,无监督学习,多模态学习等)提…...
express学习笔记3 - 三大件
便于统一管理router,创建 router 文件夹,创建 router/index.js: const express require(express)// 注册路由 const router express.Router() router.get(/,function(req,res){res.send(让我们开始express之旅) }) /*** 集中处理404请求的…...
Java课题笔记~Maven基础
2、Maven 基础 2.1 Maven安装与配置 下载安装 配置:修改安装目录/conf/settings.xml 本地仓库:存放的是下载的jar包 中央仓库:要从哪个网站去下载jar包 - 阿里云的仓库 2.2 创建Maven项目...
三步问题(力扣)n种解法 JAVA
目录 题目:1、dfs:2、dfs 备忘录(剪枝):(1)神器 HashMap 备忘录:(2)数组 memo 备忘录: 3、动态规划:4、利用 static 的储存功能:&…...
flask---》登录认证装饰器/配置文件/路由系统
登录认证装饰器 # 0 装饰器的本质原理-# 类装饰器:1 装饰类的装饰器 2 类作为装饰器 # 1 装饰器使用位置,顺序 # 3 flask路由下加装饰器,一定要加endpoint-如果不指定endpoint,反向解析的名字都是函数名,不加装饰器…...
Jvm实际运行情况-JVM(十七)
上篇文章说jmap和jstat的命令,如何查看youngGc和FullGc耗时和次数。 Jmap-JVM(十六) Jvm实际运行情况 背景: 机器配置:2核4G JVM内存大小:2G 系统运行天数:7天 期间发生FULL GC次数和耗时…...
【BASH】回顾与知识点梳理(二)
【BASH】回顾与知识点梳理 二 二. Shell 的变量功能2.1 什么是变量?2.2 变量的取用与设定: echo, 变量设定规则: set/unset2.3 环境变量的功能用 set 观察所有变量 (含环境变量与自定义变量)export: 自定义变量转成环境变量那如何将环境变量转成自定义变…...
【分布式训练】Accelerate 多卡训练,单卡评测,进程卡住的解决办法
最近想把之前的一个模型的改成多卡训练的。我并不懂DDP,DP。一开始打算使用Transformers的Trainer,但是配置的过程踩了很多坑也没有弄成功。【我是自己写的评测方法,但是我找不到能让触发Trainer去用我的方法评测的路劲】,后来偶然…...
时间复杂度为O(nlogn)的两种排序算法
1.归并排序 归并排序的核心思想:如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 归并排序使用的就是分治思想。分治&#x…...
java调用onnx模型,支持yolov5和yolov7
不点star不给解答问题 可直接运行主文件:ObjectDetection_1_25200_n.java 或者 ObjectDetection_n_7.java 都可以直接运行两个可以运行的主文件是为了支持不用网络结构的模型,即使是onnx模型,输出的结果参数也不一样,支持以下两种…...
DP-GAN损失
在前面我们看了生成器和判别器的组成。 生成器损失公式: 首先将fake image 和真实的 image输入到判别器中: 接着看第一个损失:参数分别为fake image经过判别器的输出mask,和真实的label进行损失计算。对应于: 其中l…...
自监督去噪:Noise2Void原理和调用(Tensorflow)
文章原文: https://arxiv.org/abs/1811.10980 N2V源代码: https://github.com/juglab/n2v 参考博客: https://zhuanlan.zhihu.com/p/445840211https://zhuanlan.zhihu.com/p/133961768https://zhuanlan.zhihu.com/p/563746026 文章目录 1. 方法原理1.1 Noise2Noise回…...
Mac 安装配置adb命令环境(详细步骤)
一、注意:前提要安装java环境。 因为android sdk里边开发的一些包都是依赖java语言的,所以,首先要确保已经配置了java环境。 二、在Mac下配置android adb命令环境,配置方式如下: 1、下载并安装IDE (andr…...
GDAL C++ API 学习之路 (2) GDALRasterBand篇 代码示例 翻译 自学
GDALRasterBand Class <gdal_priv.h> GDALRasterBand是GDAL中用于表示栅格数据集中一个波段的类。栅格数据集通常由多个波段组成,每个波段包含了特定的数据信息,例如高程、红、绿、蓝色等, 用于表示影像的不同特征。提供了许…...
springboot对静态资源的支持
1、spring boot默认静态路径支持 Spring Boot 默认将 / 所有访问映射到以下目录:** classpath:/static classpath:/public classpath:/resources classpath:/META-INF/resources也就是说什么也不用配置,通过浏览器可以直接访问这几个目录下的文件。 1…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
性能优化中,多面体模型基本原理
1)多面体编译技术是一种基于多面体模型的程序分析和优化技术,它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象,通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中࿰…...
