Web3 solidity编写cancelorder取消订单函数 并梳理讲述逻辑

上文 Web3 solidity订单池操作 中 我们讲述了订单池的基本概念 并手动编写了创建订单的操作

最近的 我们还是先将 ganache 环境起起来

然后 我们打开项目

上文中 我们写了makeOrder创建订单的函数

但是 也带出一个问题 我们创建之后 如果不要了 怎么干掉呀?

js中我们有 splice

但solidity中没有啊

它只有push pop只能删最后一个

者就是 一种类似于删对象的形式直接用delete去删除 但删完之后这个位置就空出来了 我们还需要移动后面的往前去

至于本文的话 这个操作 我们不会去讲

因为 我们取消订单 一定不能让他再出现在界面上 但没必要删他 因为我们需要记录

例如 我们 京东 美团这样的App,你取消了订单 但你在自己的订单中 依旧可以看到已经取消的订单

所以无论是 结束的 创建完成的 已取消的 他都会在我们的orders中存在

所以 我们完全可以给 _Order 加一个字段

类型的话 我们使用uint256数字类型 方便我们做枚举操作

名字叫 orderState 方便大家顾名思义

我们完全可以标记为 0 创建完成 1 已完成 2 已取消

这里 其实也很多老外 喜欢直接多建一个数组 直接存取消的订单 反正 这东西 主要是个解决方案 大家都有自己的写法

这里 我们就不要这个orderState了

我们再上面定义一个

javascript 复制代码
mapping(uint256=>bool) public orderCancel;

我们创建一个 mapping 对象 键是 数字类型 存放订单的id 然后 值是一个布尔类型 用来存是否已经删除

好 接下来 我们就来写这个 cancelorder 取消订单的函数

编写代码如下

javascript 复制代码
//取消订单  方法接受一个参数  订单id  代理名叫  _id
function cancelorder(uint256 _id) public {
    //根据传进来的订单id 获取到当前订单的对象
    _Order memory myorder = orders[_id];
    //判断id有没有取错
    require(myorder.id == _id);
    //将删除的数据的id 存入orderCancel  值赋值为 true 表示已经取消
    orderCancel[_id] = true;
    //最后 调用函数记录一下取消订单的事件
    emit Cancel(myorder.id,msg.sender,myorder.tokenGet,myorder.amountGet,myorder.tokenGive,
    myorder.amountGive,block.timestamp);
}

这个函数接受一个id 你的告诉我你要取消哪个订单呀 对不对 就想我们删除功能 你不给条件 任何语言它都白扯啊

然后 我们通过id 去找我们之前写的orders集合中对应这条id的对象

然后 找出对象之后 我们通过require判断 他们的id是不是一样的 避免我们拿出来的东西有问题

然后我们给刚刚创建的orderCancel记录一条数据 键为订单的id 值为true 表示他已经取消了

然后 我们最后 调用Cancel来记录取消订单的事件发生

这里参数 用myorder 也就是 我们开始通过id 在集合中找出的订单对象

但这里 我们的Cancel还没写

这里我们直接在Order 下面创建一个一模一样的 叫 Cancel

也是非常简单 反正我们事件是随便取名的

最后 我们暂时还是没有完整的环境测试 至少 现在可以看出语法有没有问题

我们终端执行

javascript 复制代码
truffle compile

编译起来至少现在语法没有任何问题

相关推荐
木西2 天前
揭秘 Web3 隐私社交标杆:CocoCat 的核心架构与智能合约实现
web3·智能合约·solidity
木西3 天前
深度拆解 Grass 模式:基于 EIP-712 与 DePIN 架构的奖励分发系统实现
web3·智能合约·solidity
Black_mario5 天前
Web3 时代的“伯克希尔”时刻:解析 Jason Hitchcock 与 Greenlane 的 Berachain 主权财库之路
web3
China_Yanhy5 天前
入职 Web3 运维日记 · 第 14 日:铸造无形钥匙 —— OIDC 与 CI/CD 施工实录
运维·web3
木西7 天前
深度解析|Form Network:BNX 迁移模块化 L2 的全流程技术实践
web3·智能合约·solidity
devmoon7 天前
区块链 Indexer 全解析:为什么 Web3 应用离不开数据索引器?(Polkadot / Ethereum / Solana 对比与未来展望)
rust·web3·区块链·以太坊·polkadot·solana·indexer
木西9 天前
STEPN相关内容延续篇:基于OpenZeppelinV5与Solidity0.8.24的创新点拆解
web3·智能合约·solidity
Lao乾妈官方认证唯一女友:D10 天前
wagmi使用方法
react.js·web3·wagmi
Lao乾妈官方认证唯一女友:D10 天前
Ethers.js使用方法
javascript·web3
木西10 天前
深度实战:用 Solidity 0.8.24 + OpenZeppelin V5 还原 STEPN 核心机制
web3·智能合约·solidity