前面一篇文章因为一些原因 被设为了进自己可见 需要的朋友可以私信我
之前 我们编写的程序上来看 交易所无非是一个代币的托管上 只是它会更加专业
本文 我们继续来看交易所的一个功能 叫游泳池
例如 我们 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
好啊 没什么语法问题 至于测试 等我将所有订单操作都完成了 我们在做更多操作了