一种实现链上orderbook的方法
最近在断断续续的学习scrypt,想到一个通过构造bsv的交易脚本来实现链上订单表的方法。记录下来,探讨一下可行性。
假设实现一个tokenA-bsv的交易对,分别讨论构造买单和卖单的方法。
卖单
假设我们要以n satoshi的价格卖出m个tokenA,那么我们可以构造一个交易tx_s1,它的一个输出是发送m个tokenA,解锁条件是必须往某个地址A发送m * n的satoshi。这个解锁条件应该可以通过scrypt的op_push_tx技术来实现,即在解锁脚本里面检查hashOutput是否等于hash(amount + lockscript)。
如果有人想要购买这个卖单,他需要构造一个新的交易tx_s2,这个交易要以这个tx_s1及output index作为其一个input,然后在output里面必须有一个是发送m * n个satoshi到地址A。然后将tx_s1和tx_s2这两个交易一起发送到链上,这样就完成了整个卖单的交易过程。
买单
假设我们想以n satoshi的价格买入m个tokenA,那么我们构造一个交易tx_b1,交易的一个输出是m * n数量的satoshi,解锁条件则是必须往某地址B发送m个tokenA。实现方法应该类似与上面卖单的实现方法。
然后如果有人需要卖出tokenA,他需要构造一个新的交易tx_b2,交易以tx_b1及output index作为一个input,然后在output里面必须有一个发送m个tokenA到地址B。然后将tx_b1和tx_b2一起发送到链上。
撤单
上面讨论的买单和卖单在发布出去的时候有两种方式。
一是可以直接发送到链上。另外一种方式是发送给专门提供交易数据集合的中心服务器,这样做的好处是在撤单的时候节省一次交易费用。
如果有人已经发送了买单或者卖单,然后要取消这个订单。第一种情况,这个订单是发送到链上去了,那么他就需要自己去赎回,即自己完成买单或者卖单的交易过程。这个过程会耗费两次交易上链的手续费。
第二种情况,如果挂单是发送给中心服务器,则直接通知中心服务器删除这个订单,同时安全起见,将挂单交易中的一个input花费掉,这样即使有人拿到了这个挂单交易,也无法发送到链上了,因为它的一个input已经不是合法的utxo了。
其他
链上交易订单表的好处就是能够保证用户的资产安全,用户的资产完全是保存在自己的钱包,发送的挂单交易,其他人也没有办法任意窃取,必须满足解锁条件才可以获得交易里面锁定的资产。
其缺点就是需要花费一些交易上链手续费。考虑到bsv的低廉手续费,以及带来的好处,这个成本应该是可以接受的。
这里面还有很多的细节没有考虑到,留到后面再慢慢补充。