基于区块链的去中心化交易所的实现方案–SWAP协议
SWAP原文有中英多国版本,不过中文貌似是台湾人写的,看起来还不如英文来的习惯,我写下体会吧:
SWAP协议实现了虚拟币的链外协商,链上交易的功能,实现买卖双方的撮合,可用来实现去中心化的数字资产交易所
SWAP协议分为了如下几个子协议
1、对等协议
2、索引子协议
3、Oracle协议
4、合约协议
依次介绍上述协议:
1、对等协议
协议的角色分为Maker和Taker,其实就是买家和卖家。协议分为两个方案
(1)订单方法
getOrder(makerAmount, makerToken, takerToken, takerAddress) 由“买家”向“製卖家”調用,用于请求交易代币的订单。如:“我想用BAT买入10个GNO。
getOrder(10, GNO, BAT, takerAddress)
(2)报价方法
报价用于表示各方之间的价格咨询。如果稍买卖双方的条件都得到滿足,报价就可以编程订单。 getQuote(makerAmount, makerToken, takerTokens) 由“买家”向“卖家”调用,请求以特定代币报价。 举例:“买入10个GNO需要多少BAT?” 、
getQuote(10, GNO, [BAT]) provideQuote(makerAmount, makerToken, takerAmounts) 由“买方”向“卖方”调用,问价。
provideQuote(makerAmount, makerToken, takerAmounts)
卖方对买方的回应:
例:“买入10个GNO你要花5个BAT。” provideQuote(10, GNO, {BAT: 5})
2、索引子协议
链外服务,买家或卖家寻找潜在的交易对手,可能找到很多潜在的交易对手,一旦找到了,就可以调用对等协议实现价格协商,完成交易。其一对一的交易流程如下:
(1) “卖方”向索引子调用addIntent。
(2) “买方”向索引子调用findIntent。
(3) 索引子向“买方”调用foundIntent(maker)。
(4)“买方”向“卖方”调用getOrder。
(5) “卖方”回应订单。
(6) “买方”对合約调用fillOrder(order)。
多对一的交易流程如下:
1. 多个“卖方”向索引子调用addIntent。
2. “买家”向索引子调用findIntent。
3. 索引子向“买家”调用foundIntent(maker)。
一旦“买家”找到合适的“卖家”,就可使用订单API来请求每个“买家”的订单并对 它们進进行比较。如果“买家”已经觉定成交某个特定订单,他可以调用fillOrder。
包括如下几个方法:
addIntent(makerToken, takerTokens)
意图说明,例如:
“我想用GNO购买BAT。” addIntent(GNO, [BAT])
removeIntent(makerToken, takerTokens)
取消购买意图。 我不再想用GNO购买BAT了。” removeIntent(GNO, [BAT])
getIntent(makerAddress)
列出与一个地址相关的有效意图。 :“列出[makerAddress]想要交易的代幣。” getIntent(makerAddress)
findIntent(makerToken, takerToken)
寻找愿意交易特定代币的人。 例:“找出愿意用GNO购买BAT的人。”
findIntent(GNO, BAT)
foundIntent(makerAddress, intentList) 索引子找到了愿意交易的人。
“已找到正在出售10个GNO以換取BAT的人。”
foundIntent(, [{makerAmount: 10, makerToken: GNO, takerTokens: [BAT]})
4、 oracle协议
oracle协议的目标主要是获得参考定价,卖方咨询流程如下:
1. “买方”对“卖方”调用getOrder。
2. “卖方”向Oracle调用getPrice。
3. Oracle向“卖方”返回价格。
4. “卖方”在分析价格信息后提供订单。
5. “买方”調用fillOrder(order)。
买家咨询流程:
1“买方”對“卖方”调用getOrder。
2. “卖方”回应一个订单。
3. “买方”向Oracle调用getPrice。
4. Oracle向“买方”返回價格。
5. “买方”在分析價格資訊後對合約調用fillOrder(order)。
5) 合约协议
完成或取消订单的乙太坊智能合約。
fillOrder(makerAddress, makerAmount, makerToken, takerAddress, takerAmount, takerToken, expiration, nonce, signature)
“买方”调用代币的原子交換。该合约确保资讯发送者与接受者匹配,并确保时间沒有超过 “过期时间”指定的期限。
例:“我想以10个BAT换5个GNO以完成此订单。
” fillOrder([maker], 5, GNO, [taker], 10, BAT, [expiration], [signature])
cancelOrder(makerAddress, makerAmount, makerToken, takerAddress, takerAmount, takerToken, expiration, nonce, signature) 取消订单的信息
已发给“买方”但还沒有完成。由订单的“制造方”调用。在合約中将此订单 标识为已完成,
例:“我想取消10个BAT换5个GNO的订单。” cancelOrder([maker], 5, GNO, [taker], 10, BAT, [expiration], [signature])
发表回复