Web3 叙述交易所授权置换概念 编写transferFrom与approve函数

news2024/12/24 9:20:04

前文
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 那么 交易肯定是没办法执行的
在这里插入图片描述
我们在合约中写的这两个对象 可以理解为 他们是一个变量 但其实 在去中心化的区块链中 他们就是数据库存储 他们将数据挂到了区块链上
在这里插入图片描述
且这种数据也不能随意更改 公开透明的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/807208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指针初阶(1)

文章目录 目录1. 指针是什么2. 指针变量的类型2.1 指针变量-整数2.2 指针变量的解引用 3. 野指针3.1 野指针成因3.2 如何规避野指针 4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 附: 目录 指针是什么指针变量的类型野指针指针运算指针和数组二级指针…

redis集群设置

先下载redis数据库可以在一台机器上设置redis集群高可用 cd /etc/redis/ mkdir -p redis-cluster/redis600{1..6} for i in {1..6} do cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-s…

号外号外!首届开源 AI 游戏挑战赛圆满结束!

🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟! 北京时间 7 月 8 日到 7 月 10 日, 我们举办了首届开源 AI 游戏开发挑战赛。这是一场激动人心的赛事活动,游戏开发者在紧迫的 48 小时内使用 AI 创造、创新有创意的游戏。 本…

gazebo学习记录(杂乱)

一、完整系列教程 如何使用gazebo进行机器人仿真(很重要):https://zhuanlan.zhihu.com/p/367796338 基础教程和关键概念讲解(很重要):https://zhuanlan.zhihu.com/p/363385163 古月居:http://w…

Web自动化测试高级定位xpath

高级定位-xpath 目录 xpath 基本概念xpath 使用场景xpath 语法与实战 xpath基本概念 XPath 是一门在 XML 文档中查找信息的语言XPath 使用路径表达式在 XML 文档中进行导航XPath 的应用非常广泛XPath 可以应用在UI自动化测试 xpath 定位场景 web自动化测试app自动化测试 …

Selenium多浏览器处理

Python 版本 #导入依赖 import os from selenium import webdriverdef test_browser():#使用os模块的getenv方法来获取声明环境变量browserbrowser os.getenv("browser").lower()#判断browser的值if browser "headless":driver webdriver.PhantomJS()e…

每日一题——删除有序数组中的重复项

删除有序数组中的重复项 题目链接 注:本题所采用的方法是建立在移除元素的基础之上的,如果大家对双指针的方法不大了解,或者不会做《移除元素》这一题,建议先去看看👉传送门 具体步骤 定义两个指针slow和fast&#…

计算并展示指定文件夹的大小

背景需求 有时候电脑里磁盘空间越来越小,不得不删除一些占空间大的文件。最笨的方法就是对某一个文件夹下一个一个查看大小,效率太慢。 效果图 Code import os import matplotlib.pyplot as plt plt.rcParams[font.family] sans-serif # 设置字体为…

Jenkins pipeline 脚本语言学习支持

1 引言 Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。 使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。 Groovy是一…

大模型开发(十四):使用OpenAI Chat模型 + Google API实现一个智能收发邮件的AI应用程序

全文共1.2w余字,预计阅读时间约24~40分钟 | 满满干货(附代码),建议收藏! 本文目标:将Gmail API接入Chat模型,编写一个智能收发邮件的AI应用程序 代码下载点这里 一、背景 大模型应用开发从谷歌云入手进行学习和AI…

Python爬虫的urlib的学习(学习于b站尚硅谷)

目录 一、页面结构的介绍  1.学习目标  2.为什么要了解页面(html)  3. html中的标签(仅介绍了含表格、无序列表、有序列表、超链接)  4.本节的演示 二、Urllib  1.什么是互联网爬虫?  2.爬虫核心  3.爬虫…

Sentinel 容灾中心的使用

Sentinel 容灾中心的使用 往期文章 Nacos环境搭建Nacos注册中心的使用Nacos配置中心的使用 熔断/限流结果 Jar 生产者 spring-cloud-alibaba:2021.0.4.0 spring-boot:2.6.8 spring-cloud-loadbalancer:3.1.3 sentinel:2021.0…

如何快速模拟一个后端 API

第一步:创建一个文件夹,用来存储你的数据 数据: {"todos": [{ "id": 1, "text": "学习html44", "done": false },{ "id": 2, "text": "学习css", "…

只会“点点点”,凭什么让开发看的起你?

众所周知,如今无论是大厂还是中小厂,自动化测试基本是标配了,毕竟像双 11、618 这种活动中庞大繁杂的系统,以及多端发布、多版本、机型发布等需求,但只会“写一些自动化脚本”很难胜任。这一点在招聘要求中就能看出来。…

Android 面试题 优化 (一)

🔥 Android性能优化指标 🔥 ​ 🔥 包体积优化 🔥 安装包的大小会影响用户的安装率,如果一个包的太大,用户安装的意愿会大大降低。 经过包分析可以看到,安装包最大的部分是资源和第三方库&#…

奥迪A3:最新款奥迪A3内饰设计及智能科技应用

奥迪A3一直以来都是奥迪的入门级车型,但这并不意味着它在科技和内饰方面会有所退步。最新款奥迪A3的内饰设计和智能科技应用让人们再次惊叹奥迪的创新能力。 内饰设计 奥迪A3最新款的内饰设计引入了奥迪最新的设计元素,比如8.8英寸的中控显示屏&#xf…

山西电力市场日前价格预测【2023-07-30】

日前价格预测 预测明日(2023-07-30)山西电力市场全天平均日前电价为287.10元/MWh。其中,最高日前电价为309.20元/MWh,预计出现在09: 15。最低日前电价为252.82元/MWh,预计出现在24: 00。 价差方向预测 1:实…

Dendrogram | 今天是人见人爱、花见花开的环形Dendrogram!~(附完整代码)

1写在前面 好长时间没更新了,这周真的是天天都在手术室度过,常讲到的一句话就是苦的一比啊。🫠 很久没有见过外面的世界了,世界那么大,我也想去看看!~😂 废话太多了,今天的教程是环形…

网络安全/信息安全(黑客技术)自学笔记

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识,可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题,可以帮助您更好地解决网络安全的原理和技术…

从分片传输到并行传输之大文件传输加速技术

随着大文件的传输需求越来越多,传输过程中也会遇到很多困难,比如传输速度慢、文件安全性低等。为了克服这些困难,探讨各种大文件传输加速技术。其中,分片传输和并行传输是两种比较常见的技术,下面将对它们进行详细说明…