前面一篇文章因为一些原因 被设为了进自己可见 需要的朋友可以私信我
Web3 solidity订单池操作-LMLPHP
之前 我们编写的程序上来看 交易所无非是一个代币的托管上 只是它会更加专业
本文 我们继续来看交易所的一个功能 叫游泳池

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

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

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

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

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

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

     address tokenGive;
     uint256 amountGive;

     uint256 timestamp;
 }

这里 我们 的数据结构 就和上面的 对应上了 两种token的数量和地址 id 用户地址 时间搓
Web3 solidity订单池操作-LMLPHP
但是 这种形式 显然只支持我们创建一个订单
如果要创建多个 这种方法肯定要加码

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

_Order[] orderlist;

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

mapping(uint256=> _Order) public orders;

定义一个mapping对象属性 然后 键是一个uint256数字类型 对应订单id 然后 值 是一个_Order对象
Web3 solidity订单池操作-LMLPHP
学过js的朋友应该都会明白二者之前的差异
数组的是这样

[1,2,3]

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

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

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

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

uint256 public orderCount;

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

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

Web3 solidity订单池操作-LMLPHP
然后 我们 编写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

Web3 solidity订单池操作-LMLPHP
好啊 没什么语法问题 至于测试 等我将所有订单操作都完成了 我们在做更多操作了

08-17 07:00