OrderBook是一个包含了所有交易者信息的订单集合,他们想买或者想卖。想买的order叫做bid,想卖的order叫做ask,这些bid和ask的order一旦满足了各自的条件,就会尽可能快的完成配对,促成一笔交易。
OrderBook是一个包含了所有交易者信息的订单集合,他们想买或者想卖。想买的order叫做bid,想卖的order叫做ask,这些bid和ask的order一旦满足了各自的条件,就会尽可能快的完成配对,促成一笔交易。这里有两个种类的order需要介绍一下,它们也是最为基本的交易订单。第一种是市价 market order,买和卖都是依据当前在orderbook能寻找到的最优价格执行。第二种是限价 limit order,买和卖都是按照已经确定量和价格进行。OrderBook是传统金融中一个很重要的交易方式,通过OrderBook中显示的信息,可以判断当前市场的供需关系以及价格关系,基于以上的判断可以对市场中的下一步发生的变化进行一个判断。在去中心化金融(Defi),刚开始发展时也借鉴到了OrderBook的模式,由于传统的OrderBook由中心化机构进行给出,导致了信息中心化不透明。所以在Defi中想实现一个OrderBook完全只有买方和卖方进行参与,而机构只收取相依的手续费即可。
看起来这样的想法是一种很不错的想法,提供了一个更加公平和自由度更高的一个市场让人们去操作。但是在实际中进行时会发现问题:
抛开以太坊特殊的条件,我们在实现OrderBook的时候,采用的最常用的方法就是蛮力法。思路:
这个方法能确保找到所需要的的交易,但是整个过程的时间复杂度为O(n),然后可以进行并发和互斥锁结合,可以在短时间内处理大量的买单和买单满足需求。但是随着订单量的增多,所需要的时间也会增多,这在链上和链下的环境中都是不能接受的。
但是,如果不采用蛮力法的话,将买单和卖单分别用排序二叉树的方式进行数据保存,那样的话时间复杂度就会变为O(logn),这样可以优化查找,只是在插入是有点麻烦。
在智能合约中我们要尽量避免时使用循环的方式,这是很费gas的。而为了确保能够得到想要的价格。我们可以这样设计:
mapping(uint => mapping(uint => address[])) Bid;
mapping(uint => mapping(uint => address[])) Ask;
看上去这样的两个映射可以解决买卖双方的订单的查找的时间复杂度问题(将时间复杂度降为O(1))。但是这样却忽略了一个问题,这样做我们无法看到整个市场的变化和趋势。我们这样设计代码的话只是实现了OrderBook的一部分功能。如果想要实现OrderBook,还有很多要进行修改的地方。
在链上尽量不要使用大循环,但是我们可以将大循环变为小的循环,这样来说是可以的。同时我们也要反映整个OrderBook的变化,我们就可以设计一个压缩前缀树:
这样的话就可以兼顾市场变化和挂单的需求。
以上的思路都可以实现OrderBook,但是还有许多问题需要进行考虑:
虽然现在主流的DEX没有使用OrderBook,而是使用LP这样的方式,但是LP也会存在着很多的问题需要解决。正是因为OrderBook的一些功能无法满足Defi的需求,所以才会有LP的出现。技术的适用性是需要结合需求的。或许在以后可能会产生适应区块链的OrderBook。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!