Web3 solidity订单池操作

前面一篇文章因为一些原因 被设为了进自己可见 需要的朋友可以私信我
在这里插入图片描述
之前 我们编写的程序上来看 交易所无非是一个代币的托管上 只是它会更加专业
本文 我们继续来看交易所的一个功能 叫游泳池

例如 我们 100grToken 兑换 1ETH
前提 我们的代币已经能被估值了
例如 你想用人民币对美元 中间他们之间的汇率是要规定好的
但我们这里 本身就是一个模拟环境
我们直接去操作也不太合理
所以 我们这里直接开发一个游泳池功能 或者叫订单池

我们可以自己去创建订单 例如 小明发布一个 你们谁愿意用 100grToken 换 1 ETH啊
我们未完成的订单就会在我们游泳池中 如果有人觉得合适 点了这个确定 后台就会操作 将他和发布这个订单的人相应的数据扣除 完成这个订单
但也可能 某某发布了 但因为汇率变化 觉得之前发的这个不太合适了 也可以取消

这里 我们需要创建三个函数
makeOrder 创建订单
cancelOrder 取消订单
fillorder 填充订单

还是标准流程 启动我们的ganache环境
在这里插入图片描述
然后 我们这边还有个问题 我们不能很好的查到用户的 token数量
那么 我们需要在Exchange.sol中 加一个balanceof 函数 我们指定查询tokens 下 对应地址 下对应用户的值
返回一个uint256数字类型的值
然后 设置了 public函数作用域是公共的 view设置他只是读取我们区块链上的信息
在这里插入图片描述
然后 我们任何订单 都需要包含以下几个信息
id 这是数据结构最基本的东西 要有id才能标记和删除订单
创建订单的用户 因为 肯定在界面展示时也需要进行权限判断 要是当前用户 才能对订单进行删除和管理
再就是 用什么 代币 去 兑换另一种代币
时间 存储订单的创建时间

这些成员必须是要有的
我们要梳理正思想 我们没有服务器 没有数据库 所以 你生命在链上的数据结构 它就是数据存储
然后 我们在交易所 Exchange.sol 合约中声明一个这样的订单结构体

 //订单结构体
 struct _Order{
     uint256 id;
     address user;
     
     address tokenGet;
     uint256 amountGet;

     address tokenGive;
     uint256 amountGive;

     uint256 timestamp;
 }

这里 我们 的数据结构 就和上面的 对应上了 两种token的数量和地址 id 用户地址 时间搓
在这里插入图片描述
但是 这种形式 显然只支持我们创建一个订单
如果要创建多个 这种方法肯定要加码

比较简答的方式 自然就是用一个_Order类型的数组

_Order[] orderlist;

但这里 为了方便通过id查询 我选择直接

mapping(uint256=> _Order) public orders;

定义一个mapping对象属性 然后 键是一个uint256数字类型 对应订单id 然后 值 是一个_Order对象
在这里插入图片描述
学过js的朋友应该都会明白二者之前的差异
数组的是这样

[1,2,3]

而我们现在用的对象形式的是这样的

{
    0: 1,
    1: 2,
    2: 3
}

但无非 我们对象的键 我们用的是订单的id
我们就可以通过 对象[订单id] 这种形式去找到他

然后 我们再在下面创建一个

uint256 public orderCount;

数字类型 只是单纯记录一下订单的数量
在这里插入图片描述
然后 我们就可以在下面去写这个
makeOrder了 创建订单
但经过前面几篇 交易所的内容 我想大家也养成了 事件记录的好习惯
那么 这里 创建订单 我们也需要记录
我们定义一个事件

event Order(uint256 id,address user,address tokenGet,uint256 amountGet,address tokenGive,uint256 amountGive,uint256 timestamp);

在这里插入图片描述
然后 我们 编写makeOrder函数

function makeOrder(address _tokenGet,uint256 _amountGet,address _tokenGive,uint256 _amountGive) public {
    orderCount = orderCount.add(1);
    orders[orderCount] = _Order(orderCount,msg.sender,_tokenGet,_amountGet,_tokenGive,_amountGive,block.timestamp);
    emit Order(orderCount,msg.sender,_tokenGet,_amountGet,_tokenGive,_amountGive,block.timestamp);
}

然后 我们这个参数 接受 两种代币的 地址和 数量 然后 我们获取orderCount 将他加一 例如 我们第一次进来 他是0 我们将他加1 这样 他就是1 然后 我们将当前订单复制 id就是orderCount
第二次进来 orderCount 是 1 加一 就成了2
然后 我们用户还是通过msg.sender去拿 谁调用的拿谁
通过block.timestamp 获取当前时间的时间搓

将数据添加完之后 调用我们刚刚写的Order 记录一下订单信息
好 这里 我们其实还不具备测试的条件 为了保证我们代码没问题 我们在终端执行

truffle compile

在这里插入图片描述
好啊 没什么语法问题 至于测试 等我将所有订单操作都完成了 我们在做更多操作了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JVM】如何判定一个对象已死以及“标记-清除”、“标记-复制”、“标记-整理”三种垃圾收集算法

文章目录 0、如何判定一个对象的生死?1、上文提到的引用又是什么1、强引用:2、软引用:3、弱引用:4、虚引用: 2、垃圾收集算法1、标记-清除2、标记-复制优化:👇 3、标记-整理 0、如何判定一个对象…

item_password-获得淘口令真实url

一、接口参数说明: item_password-获得淘口令真实url ,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_password 名称类型必须描述keyString是调用key&#xff08…

用cpolar生成的公网地址,对位于本地的Cloudreve网盘进行访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局&#…

Springboot集成ip2region离线IP地名映射-修订版

title: Springboot集成ip2region离线IP地名映射 date: 2020-12-16 11:15:34 categories: springboot description: Springboot集成ip2region离线IP地名映射 1. 背景2. 集成 2.1. 步骤2.2. 样例2.3. 响应实例DataBlock2.4. 响应实例RegionAddress 3. 打开浏览器4. 源码地址&…

米尔瑞萨RZ/G2L开发板-02 ffmpeg的使用和RTMP直播

最近不知道是不是熬夜太多,然后记忆力减退了? 因为板子回来以后我就迫不及待的试了一下板子,然后发现板子有SSH,但是并没有ffmpeg,最近总是在玩,然后今天说是把板子还原一下哇,然后把官方的固件…

Beats:安装及配置 Metricbeat (一)- 8.x

在我之前的文章: Beats:Beats 入门教程 (一)Beats:Beats 入门教程 (二) 我详细描述了如何在 Elastic Stack 7.x 安装及配置 Beats。在那里的安装,它通常不带有安全及 Elasticsearc…

Redis - 数据类型映射底层结构

简介 从数据类型上体现就是,同一个数据类型,在不同的情况下会使用不同的编码类型,底层所使用的的数据结构也不相同。 字符串对象 字符串对象的编码可以是 int、raw 和 embstr 三者之一。 embstr 编码是专门用于保存简短字符串的一种优化编…

Docker查看、创建、进入容器相关的命令

1.查看、创建、进入容器的指令 用-it指令创建出来的容器,创建完成之后会立马进入容器。退出之后立马关闭容器。 docker run -it --namec1 centos:7 /bin/bash退出容器: exit查看现在正在运行的容器命令: docker ps查看历史容器&#xff0…

解决Java中的“Unchecked cast: java.lang.Object to java.util.List”问题

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

嵌入式系统中如何选择RTC电池?

RTC(Real Time Clock)是一种用于提供系统时间的独立定时器,它可以在系统断电或低功耗模式下继续运行,只需要一个后备电池作为供电源。在嵌入式系统中,选择合适的RTC电池时非常关键的,它会影响系统时间的准确…

CSS自己实现一个步骤条

前言 步骤条是一种用于引导用户按照特定流程完成任务的导航条,在各种分步表单交互场景中广泛应用。例如:在HIS系统-门诊医生站中的接诊场景中,我们就可以使用步骤条来实现。她的执行步骤分别是:门诊病历>遗嘱录入>完成接诊…

【设计模式】装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为…

Gitlab CI/CD笔记-第二天-主机套接字进行构建并push镜像。

一、安装gitlab-runner 1.可以是linux也可以是docker的 2.本文说的是docker安装部署的。 二、直接上.gitlab-ci.yml stages: # List of stages for jobs, and their order of execution - build-image build-image-job: stage: build-image image: harbor.com:543/docke…

【Java转Go】快速上手学习笔记(三)之基础篇二

【Java转Go】快速上手学习笔记(二)之基础篇一 了解了基本语法、基本数据类型这些使用,接下来我们来讲数组、切片、值传递、引用传递、指针类型、函数、map、结构体。 目录 数组和切片值传递、引用传递指针类型defer延迟执行函数map结构体匿名…

【仿写框架之仿写Tomact】四、封装HttpRequest对象(属性映射http请求报文)、HttpResponse对象(属性映射http响应报文)

文章目录 1、创建HttpRequest对象2、创建HttpResponse对象 1、创建HttpRequest对象 HttpRequest对象中的属性与HTTP协议中的内容对应,用于后序servlet从request中获取请求中的参数。 参照http请求报文: import java.io.BufferedReader; import java…

2023年国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短时…

FreeModbus——介绍(二)

1.简介 freemodbus_百度百科 (baidu.com) :参考自百度百科,里面还有移植介绍,非常详细 1. FreeMODBUS是一个奥地利人写的Modbus协议。它是一个针对嵌入式应用的一个免费(自由)的通用MODBUS协议的移植。 2. FreeMOD…

【Linux】模拟实现linux的shell

#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> #define NUM 1024 #define SIZE 32 #define SEP " " int main() {//保存输入后的字符串char …

夏威夷等全球多地深陷「末日狂烧」,关键时刻 AI 监测能否跑赢野火?

内容一览&#xff1a;当地时间 8 月 8 日&#xff0c;美国夏威夷州突发野火&#xff0c;当地居民和游客不得不跳入太平洋中躲避火势。截至 8 月 17 日&#xff0c;这场野火已经造成110 人死亡&#xff0c;超过 1000人失踪。与此同时&#xff0c;美国、加拿大、法国等地也正遭遇…

消息队列总结

前言 你用过消息队列么&#xff1f; 说说你们项目里是怎么用消息队列的&#xff1f; 我们有一个订单系统&#xff0c;订单系统会每次下一个新订单的时候&#xff0c;就会发送一条消息到ActiveMQ里面去&#xff0c;后台有一个库存系统&#xff0c;负责获取消息&#xff0c;然后…