去中心化Token互换协议R1协议介绍
扫描二维码
随时随地手机看文章
R1协议是一种高效的去中心化Token互换协议。它解决了传统Token互换协议撮合效率低、用户体验差等问题,将去中心化Token互换协议带入了一个新的高度。目前,基于以太坊的版本已经实现,后续会开发其他公链版本如NEO、QTUM等。
去中心化Token互换协议的发展
传统互联网是传递信息的网络,信息都保存在中心化的机构中,由于缺乏可靠的信任机制,陌生节点间无法完成大规模的价值互换。比特币的出现使可信的价值转移成为了可能,它对中心化互联网发起了挑战,同时也带动了区块链技术的蓬勃发展。在后比特币时代,涌现了一大批区块链创新技术,以太坊正是新型区块链的卓越代表,除了价值转移外,它实现了智能合约,将现实世界的规则以算法的形式映射在区块链上,极大的扩展了区块链的应用范围。一大批区块链项目基于以太坊的ERC-20标准发行了自己的代币,据不完全统计,目前以太坊上运行的代币超过一千种, 构成了庞大的代币经济体系。
种类繁多的代币对于交换提出了强劲的需求,带动了去中心化Token互换协议的研究,陆陆续续涌现了Etherdelta、0x、IDEX等去中心化交易所,不断的挑战中心化交易所的地位。但是,受限于当前以太坊的性能,他们都存在着或多或少的问题,交易体验不尽如人意。
· Etherdelta
Etherdelta的用户需要把资产存入Etherdelta智能合约。在交易时,用户将订单拦到链FRelayer,等待别人来成交。如果想要吃别人的订单,用户需要手动指定对应的订单发起交易。Etherdelta不会自动撮合用户的订单,交易体验较差。
· 0x
0x用户不需要将资产存入智能合约,只需要钱包中拥有ETH或T oken即可。在开始交易之前,用户需要将钱包中的ETH转换为一种叫做WETH的代币。WETH是与ETH等价的ERC-20代币,转换比例为1:1,将ETH转换成W ETH可以使0x合约方便的与其他ERC-20Tokcn进行结算。
开始新交易对的交易前,用户还需要设置对应Token的权限,授权允许0x合约转移该Token。尽管0x做到了足够的去中心化,但是其撮合效率还是很低。对接0x协议的撮合引|擎必须不问断的监听用户钱包的资金进出,如果用户钱包的余额不足,就需要把用户的委托订单从订单簿中剔除,一旦剔除不及时,该委托订单的对手方将交易失败。在网络拥堵或者波动大时,这种情况可能频繁出现,严重影响用户体验。
· IDEX
意识到0x协议的不足——0x智能合约和Rela yer无法完美的协调合作,IDEX选择由中心化的Relayer将交易提交到链上。这样IDEX可以很好的空制订单顺序,但是任然没有解决抢单的问题。
R1协议
1. 架构
R1协议的架构包含三部分。
作为去中心化的媒介,R1智能合约部署在以太坊区块链上,可以存储用户的资产、交易记录,达到资产去中心化、交易记录可审计的目标。
Relayer是订单中继系统,与R1智能 合约交互,主要负责订单撮合与提交上链。Relayer对外提供OpenAPI,允许第三方交易所提交订单到撮合引擎。
第三方交易所的主要职责是收集用户的订单数据,并将签名后的订单提交给Relayer。通过R1协议,不同交易所可以成为分布式商业系统的一部分,共享订单数据和流动性,为用户带来更好的交易深度和体验。
2. 订单交易
2.1订单交易流程
订单交易处理流程描述了从用户提交订单开始,到Relayer撮合订单,再到将交易数据提交到区块链上的过程。如图所示:
1. 用户输入订单信息。用户以一定价格和数量买入或者卖出token, 客户端将数据转换成约定的订单数据格式。
2. 用户使用私钥对订单签名。私钥由用户保管,任何交易所以及Relayer不存储用户的私钥。放入后台订单池。签名完成后,客户端将订单信息发送给Relayer, Relayer对订 单信息进行合法性校验后,放入订单池进行撮合。
3. 后台撮合成功。Relayer的撮合引擎对来自不同交易所的所有订单进行统一撮合。
4. 后台提交到链上交易。撮合成功后,Relayer会将匹配的两个订单信息及交易额提交到区块链上进行最终的结算。
以上为订单交易的基本流程,下面详细说明每个过程的技术细节,包含:
●订单的数据格式;
●订单签名算法;
●Relayer职责;
●链上结算逻辑。
2.2 订单
订单数据格式
在交易所中,用户的订单信息体现为:交易对+交易价格+交易数量。
而在R1智能合约中,订单的数据格式如下:
参数说明如下:
● tokenBuy: 用户希望购买的token合约地址
● amountBuy: 用户 希望购买的token数量
● tokenSel: 用希望卖出的token合约地址
● amountSell: 用户希望卖出的token数量
●baseToken:交 易对锚定的基础token。默认填0,表示对ETH的交易对。如果是对RNT的交易对,此处填RNT的合约地址
● expires:订单过期区块数。默认设置-一个比较大的值,表示永不过期
● nonce: 随机数。 用来保证订单唯一性,目前的方案是nonce值为时间藏
●feeToken: 手续 费支付方式。如果为0,按传统方法支付,即手续费从用户获得的token中扣除。如果为token合约地址,则使用该种Token支付手续费,前提是用户存入了该token到R1智能合约中
订单签名
为了让用户的订单能够在网络中安全的传播并且不被篡改,需要用户的私钥对订单数据进行签名。
订单数据的签名过程为:
其中
客户端将订单数据签名完成后,会将订单原始数据、订单哈希值和订单签名一起发生到Relayer。Relayer会对这些数据进行合法性校验,主要校验订单哈希值是否一致、订单签名是否正确,以防止订单数据被篡改。
需要强调的一点是,对于Relayer来说,在接收到用户的订单信息之前,无法知道这个用户是maker还是taker。Relayer会根据订单信息到达的时间先后和当前订单池的数据,来决定这个用户是taker还是maker。如果订单池中有对应的订单匹配价格,则最新提交订单的用户成为taker,另一方则成为maker。所以,每个用户提交的订单都应该包含订单原始数据、订单哈希值和订单签名,对于Relayer来说每个用户都是对等的。
2.3 Relayer撮合
Relayer主要负责订单撮合、钱包余额维护、提交上链等。Relayer内部各系统组成如下图所示:
● OpenAPl: Relayer 对外提供API,第三方可以通过OpenAPI提交订单、查询交易状态、订单深度以及钱包余额
● Valiator: 对订单数据合法性进行校验,对账广余额进行校验
● AccountSystem: 负责维护钱包余额
● BlockSyncing: 负责区块信息同步,同步区块链余额信息等
● MatchingEngine: 撮合引擎,负责撮合订单
● MessageQueue: 消息系统。负责系统间通信
●Store: 存储模块。负责存储信息,临时数据缓存等。
Relayer处理逻辑
Relayer收到订单数据后的内部处理流程如下:
1. 对订单数据进行校验。 这里主要校验订单的哈希值是否匹配,防止订单数据被篡改;校验用户签名是否正确,保证订单数据确实由某个拥有正确私钥的账号发起; 校验余额是否充足; 这里任何一步交易不通过都会引发订单提交的失败
2. 订单撮合。订单数据校验成功后,订单被放入撮合引擎进行撮合,同时订单数据记录到数据库中。撮合引擎会根据订单提交时间和价格高低来匹配订单,一旦撮合成功,会标记订单成交。并且会将匹配的两个订单放入消息队列,等待提交到链上结算。
3. 提交上链。 提交到链上结算调用合约的batchTrade或trade方法, 并且只有admin账号进行提交。admin账号是由合约owner设置的账号,有权限调用trade方法。为了提高并发,Relayer可以用多个admin账号调用trade方法。
交易手续费
由于调用trade方法的是admin账号,因此gas费用是从admin账号中扣除的。Relayer需 要保证admin账号有足够的ETH额度,否则可能由于额度不足以支付gas费用而无法提交上链。
这笔gas费用会由admin事先垫付,但是最终还是需要由交易双方来共同承担。目前的做法是maker和taker各承担gas费用的50%。
所以,用户的手续费包含两部分:交易额的0.1%+ gas费用的50%。Relayer会根据这 个原则算出需要扣除的token数量,传入trade方法作为参数,trade方法 会扣除相应的费用。对于用户来说,用户实际得到的token数量会比交易计算得到的数量少一些,少的部分即为扣除的费用。
2.4 链上结算
链上结算的逻辑主要在R1智能合约的trade方法中实现。trade方法主要对maker和taker的订单进行校验,以及做资产的链上交割。
以下说明trade方法的具体实现细节
输入参数
trade方法的输入参数包含以下几部分: ;
1. maker的订单数据(见订单数据格式一节说明)
2. taker的订单数据 (见订单数据格式一节说明)
3. maker的签名信息(υ,r,s)
4. taker的签名信息 (υ,r,s)
5. 交易额( Relayer根据撮合结果设置本次交易额)
6. maker和taker的应收手续费(由Relayer设置)
7. 接收手续费的账号 (由Relayer设置)
其中1、2、3、4这四部分的信息由用户提供,其他人都不可篡改;而5、6、7三项数据由Relayer设置,
输入参数校验
在进行最终的资产交割前,需要交验输入的参数是否合法,以保证交易能够按照用户的意图进行成交。需要校验的步骤包含:
●必须是admin账号调用trade方法
●feeAccount (手续费接收账号)必须合法。也就是说feeAccount必须是合约owner授权过的
●交易双方的订单必须是同一交易对。合约中的代码片段:
· maker和taker的签名确认。 合约中的代码片段如下:
· 订单价格必须匹配。订单成交的基础是价格匹配,价格必须满足:
其中:
合约中代码片段如下:
●余额充足。需要保证订单交易的时候有足够的额度,不会超过用户希望交易的额度
以上所有条件校验通过,才能进行最终的资产交割。交割成功,该笔交易会完整的记录在区块链上。
3. 充值与提现
R1协议的充值提现与中心化交易所的流程基本一致,不同的是使用R1协议的用户将资金存入智能合约中,不受任何第三方控制,即使交易所被黑客攻击,用户的资金也是安全的,做到了资产的去中心化。需要注意的是,只有私钥的所有者才能操作转入R1智能合约的资产,用户需要妥善保管自己的私钥。
3.1充值
R1智能合约中用户通过两个方法进行充值:
●deposit ()
●depositToken
deposit方法允许用户将eth充入R1智能合约中。该方法会在区块链上登记用户的资产余额,同时抛出一个Deposit 充值事件; Relayer通过监听该事件感知用户的充值。
depositToken方法允许用户将token充入R 1智能合约中。与充值eth的不同之处在于,根据ERC-20 Token的标准,用户充值前需要调用token合约的approve 方法,授权R 1智能合约转账token。只有完成这一步操作, 用户才能成功将token充入智能合约中。为了减少approve操作次数,接入R1协议的交易所可以在用户第一次充值token时让用户授权一个比较大的额度。这样,用户再次充值该token时,不需要进行额外的approve操作,消耗gas 费用。
3.2 提现
用户可以随时取出自己的资金,不需要人工审核。R1智能合约的用户提现有以下几种方法:
● adminWithdraw
● withdraw
● withdrawNoLimit
adminWithdraw是比较常用的提现方法。它的原理是,用户将提现的操作委托给Relayer,Relayer根据用户的提现请求调用R1合约的admin Withdraw,将资金转账给用户的钱包。由于提现请求需要用户的私钥签名,任何第三方(包括Relayer )都不能篡改用户的数据,保证了提现的安全可靠。该方法的意义在于,提现请求最先由Relayer感知,Relayer可以快速及时地更新订单池,提供更好的交易体验。
withdraw适用于懂得如何调用智能合约的用户。如果用户不希望将提现数据委托给Relayer,那么他可以选择调用合约的withdraw方法。但是在调用该方法前,用户需要经历一个两阶段提现的过程。即用户需要先调用apply Withdraw方法申请提现,在满足以下两个条件的情况下,用户才能调用
withdraw方法成功提现。这两个条件是:
1. Relayer调用了approveWithdraw 方法, 同意用户的提现请求;
2. 申请超过了一定的等待期后;
等待期由合约的owner设置,当前设置的等待期为7天。合约owner会视不同情况调整等待期,如1天甚至1小时,但不能超过7天。
withdrawNoLimit允许用户方便的提现。只需要调用该方法即可提现,前提是合约的owner开启该方法的开关。一般情况下该方法是关闭的,只有在特殊情况如Relayer由于某些原因不能及时响应用户的提现申请时,该方法才会打开,方便用户提现。
4. R1合约的治理
作为以太坊区块链上的-份智能合约,R1 由ONEROOT团队创建并部署,即R1智能合约的owner为ONEROOT团队。为了保证R1协议安全稳定的运行,R1 智能合约的owner拥有一些特殊的权限,包含:
● 设置admin 管理员账号。admin账号负责调用trade、 adminWithdraw、 approveWithdraw等方法,保证Relayer维持正常的交易功能。
● 设置手续费账号。只有经过授权的账号才能接受用户支付的手续费。
● 调整提现等待时间。R1智能合约的owner可以根据情况调整提现等待时间,方便用户提现。
● 开启便捷提现开关。在特殊情况下,如Relayer无法提供提现服务时,R1 合约的owner需要开启该开关,方便用户快速地提现。
admin Withdraw是比较常用的提现方法。它的原理是,用户将提现的操作委托给Relayer,Relayer根据用户的提现请求调用R1合约的adminWithdraw,将资金转账给用户的钱包。由于提现请求需要用户的私钥签名,任何第三方(包括Relayer )都不能篡改用户的数据,保证了提现的安全可靠。该方法的意义在于,提现请求最先由Relayer感知,Relayer可以快速及 时地更新订单池,提供更好的交易体验。
未来研究
作为价值传输网络的重要组成部分,中心化Token互换协议的研究日益深入,相关产品层出不穷。R1协议专注于提升用户的交易体验,力求达到中心化交易所的标准。然而,对所有基于以太坊的协议来说,以太坊网络的处理能力始终是提升交易速度的瓶颈。但这并非一成不变的,即将到来的Plasma技术为以太坊带来了商用化的希望。
Plasma技术的实现将大幅度提升以太坊网络的TPS,改变以太坊网络拥堵的状况。同样的,R1协议也可以采用Plasma技术,在以太坊上部署-份Plasma合约, 同时启动一条Plasma子链,将Relayer的功能迁移到Plasma子链上,在提升性能的同时做到完全的去中心化。
除了以太坊网络的技术发展,在其他公链上实现R1协议也是ONEROOT团队的研究方向。以EOS为例,随着生态的不断发展,基于EOS的Token将越来越多,相应的去中心化交易所也会不断涌现。受益于良好的TPS性能,这些交易所性能将远超以太坊,为用户带来非凡的交易体验,而这也是ONEROOT研究的方向。