一种低滑点高流动性去中心化代币兑换的方法
技术领域
本发明涉及去中心化代币兑换技术领域,具体为一种低滑点高流动性去中心化代币兑换的方法。
背景技术
区块链产业发展迅猛,每年有数以千计的区块链资产被发行出来,并且这一趋势正在迅速上升,远没有达到顶峰。可以预见,未来市面上将存在数千万乃至更多的流通区块链资产(按每个公司发布一个区块链资产估算)。区块链资产本身是以去中心化的方式存储在区块链上的,用户有很强的兑换或交易(Swap or Exchange)需求。目前的区块链资产交易需求主要由中心化交易平台满足。用户需要将区块链上的去中心化资产,交由中心化交易平台代为管理,然后在中心化交易平台.上采用挂单竞价或集合竞价的方式进行交易。
主要存在问题为:
1)用户失去了对区块链资产的实际控制权,一旦中心化交易平台发生问题,用户的资产安全将受到威胁。
2)中心化交易平台资源有限,只能处理部分热门资产的兑换。比如全球支持区块链资产最多的中心化交易平台之一的Gate.io,目前仅支持了300多个币种,500多个交易对。远未达到未来处理数千万种资产的处理能力。
去中心化的兑换交易平台,可以同时解决以上两个问题。去中心化兑换交易平台的主要问题是:
1)因为每一笔交易逻辑需要在每一个区块链节点上得以验证和存储,因此处理和存储逻辑需要极其简单,否则将产生很高的交易成本。因此传统的中心化交易平台的挂单和撮合逻辑并不能很好的适应去中心化交易。有的项目会采用链外挂单撮合(Offchainorderbook and matching),链上成交清算的方式来降低链上执行成本问题,但是存在去中心化程度差和链外撮合容易作弊的信任危机。
2)去中心化资产的安全存储问题。去中心化的链上资产由用户个人持有和保管,私钥保存在用户手上,普通用户不一定具备中心化平台的专业管理经验和基础设施,很容易成为黑客盗取的目标。并且用户私钥很容易出现损毁而无法恢复资产的情况。需要采用多签硬件设备或类似GateChain提出的链上保险账号等方式,降低去中心化资产安全保管门槛,让普通大众可以做到安全保管自己的资产。
2017年由Alen Lu提出一种适合在以太坊网络上实现的去中心化交易协议,在以太坊智能合约中采用乘积不变方程X*Y=k,可以为X和Y资产兑换实现自动做市商。Uniswap项目实现了这一方法,并在2020年DeFi热潮中大获成功。乘积不变方程还可以推广到更为一般的形式,比如Balancer为多种资产按任意权重配置并可根据市场价格变化自动调整资产数量保持资产价值比例,同时可以为两两资产提供兑换服务。是一个比Uniswap更加一般话的实现。
在使用常数乘积自动做市商方式CPMM(Constant product market maken)的去中心化实现中,存在两个缺点:
1)无常损失(impermanent loss)。当价格发生偏移时,不管是上涨还是下跌,都会给流动性提供者(Liquidity Provider LP)带来无常损失(impermanent loss),这种损失只有价格回到LP抵押时的价格原点时才能得以消除,这会打击流动性提供者LP的积极性。因此在Uniswap中收取Taker0.3%的高额手续费来奖励LP,以弥补他们的无常损失。但是这将会影响Taker的积极性。
2)高滑点成本(High price slippage cost)。采用X*Y=k这样的乘积常数曲线模型,当单笔交易金额较大时,将产生很高的价格滑点(price slipage),给Taker带来很高的成本。要消除这一滑点,可以采用X+Y=k这样的直线模型,但是这将造成市场价格不随市场需求变化。curve.fi针对稳定币的兑换特点,提出一种曲线和直线模型相结合的新模型,可以有效降低稳定币兑换的滑点。但这一模型并不适合任意币种的兑换。
2020年,Bancor去中心化兑换协议在V2版本中提出一种利用预言机获得中心化交易市场价格,并动态更新LP池权重来消除无常损失的方法。并且对LP池采用20倍放大来降低交易价格滑点。但是这一方法只适合已经在中心化平台有成熟交易市场,并且已经有预言机支持的交易对,对于更多的新币种和小币种市场,预言机很难迅速和全面的支持,这一方法就不适应了。因此这大大限制了此方法的使用范围。
发明内容
本发明专利的目的在于提供一种低滑点高流动性去中心化代币兑换的方法。
为实现上述目的,本发明提供如下技术方案:一种低滑点高流动性去中心化代币兑换的方法,步骤为:
由流动性提供者为流动性池提供流动性,通过抵押的方式等价值比例的X代币和Y代币存入到流动性池;
通过X挂单者和Y挂单者独立为X挂单池和Y挂单池提供流动性;
X挂单池内记录有X挂单池的X数量、X挂单池的Y数量、X挂单池的手续费奖励池、X挂单池中Y数量历史积累的平均兑换价格和X挂单者平均存币时间;
Y挂单池内记录有Y挂单池的Y数量、Y挂单池X数量、Y挂单池手续费奖励池、Y挂单池中X数量历史积累的平均兑换价格、Y挂单者平均存币时间;
当X挂单者向X挂单池存入X时,通过合约账户记录下单的X数量和最后一次存入X的时间;
当Y挂单者向Y挂单池存入Y时,通过合约账户记录下单的Y数量和最后一次存入Y的时间;
吃单者通过随机数判断或者按照固定比例分配从流动性池里面兑换或者从挂单池里面兑换。
优选的,当吃单者从流动性池进行兑换的时候,需求的改变造成价格的波动,经过不同方向的吃单者操作竞争形成一个合理的价格;当吃单者从X挂单池或者Y挂单池进行兑换的时候,价格以流动性池的当前价格为准,当吃单者从Y兑换为X的时候,X挂单池的X数量减少,X挂单池的Y数量增多,同时积累X挂单池的手续费奖励池;当吃单者从X兑换为Y的时候,Y挂单池的Y数量减少,Y挂单池的X数量增多,同时积累Y挂单池的手续费奖励池。
优选的,X挂单者把X存入X挂单池,从X挂单池内的Y池内提取兑换的Y币种时,价格以X挂单池中Y数量历史积累的平均兑换价格,需要支付的手续费跟存入时间有关系,如果存入时间小于X挂单者平均存币时间,需要缴纳手续费,手续费加入到X挂单池的手续费奖励池,如果大与X挂单者平均存币时间,获得手续费,手续费取自X挂单池的手续费奖励池。
优选的,当出现X挂单池或Y挂单池里面已经兑换完成的资产价值不如场外合算的情况,X挂单池或Y挂单池进行更换。
优选的,还包括有计时模块,用于当X挂单池或Y挂单池进行更换时,开始计时,当计时模块计时时间小于预先设定的最低持续时间时,X挂单池或Y挂单池不允许更换,当计时模块计时时间大于预先设定的最低持续时间时,X挂单池或Y挂单池允许触发切换。
优选的,当挂单池完成兑换到达预定比例时,下一笔挂单者进行存入操作时,切换到新挂单池,新存入的X或Y将自动进入到新的挂单池,并重新开始统计平均兑换价格,且之前在老的挂单池存入X或者Y的挂单者,只能从老的挂单池里面获取X或Y。
优选的,所述的预定比例大于0,小于1。
与现有技术相比,本发明的有益效果是:
本发明可以有效降低兑换滑点:如果杠杆率是n,那么可以让滑点降低为Uniswap模式的1/n。
且提供更多的需求,比如计划一段时间内卖出一种资产获得另一种资产的用户可以来提供流动性,而不单纯是让同比抵押的用户提供流动性。
具体实施方式
下面将对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。
一种低滑点高流动性去中心化代币兑换的方法,步骤为:
由流动性提供者为流动性池提供流动性,通过抵押的方式等价值比例的X代币和Y代币存入到流动性池;
通过X挂单者和Y挂单者独立为X挂单池和Y挂单池提供流动性;
X挂单池内记录有X挂单池的X数量、X挂单池的Y数量、X挂单池的手续费奖励池、X挂单池中Y数量历史积累的平均兑换价格和X挂单者平均存币时间;
Y挂单池内记录有Y挂单池的Y数量、Y挂单池X数量、Y挂单池手续费奖励池、Y挂单池中X数量历史积累的平均兑换价格、Y挂单者平均存币时间;
当X挂单者向X挂单池存入X时,通过合约账户记录下单的X数量和最后一次存入X的时间;
当Y挂单者向Y挂单池存入Y时,通过合约账户记录下单的Y数量和最后一次存入Y的时间;
吃单者通过随机数判断或者按照固定比例分配从流动性池里面兑换或者从挂单池里面兑换。
当吃单者从流动性池进行兑换的时候,需求的改变造成价格的波动,经过不同方向的吃单者操作竞争形成一个合理的价格;
当吃单者从X挂单池或者Y挂单池进行兑换的时候,价格以流动性池的当前价格为准,当吃单者从Y兑换为X的时候,X挂单池的X数量减少,X挂单池的Y数量增多,同时积累X挂单池的手续费奖励池;
当吃单者从X兑换为Y的时候,Y挂单池的Y数量减少,Y挂单池的X数量增多,同时积累Y挂单池的手续费奖励池。
X挂单者把X存入X挂单池,从X挂单池内的Y池内提取兑换的Y币种时,价格以X挂单池中Y数量历史积累的平均兑换价格,需要支付的手续费跟存入时间有关系,如果存入时间小于X挂单者平均存币时间,需要缴纳手续费,手续费加入到X挂单池的手续费奖励池,如果大与X挂单者平均存币时间,获得手续费,手续费取自X挂单池的手续费奖励池。
当出现X挂单池或Y挂单池里面已经兑换完成的资产价值不如场外合算的情况,X挂单池或Y挂单池进行更换。
还包括有计时模块,用于当X挂单池或Y挂单池进行更换时,开始计时,当计时模块计时时间小于预先设定的最低持续时间时,X挂单池或Y挂单池不允许更换,当计时模块计时时间大于预先设定的最低持续时间时,X挂单池或Y挂单池允许触发切换。
当挂单池完成兑换到达90%时,下一笔挂单者进行存入操作时,切换到新挂单池,新存入的X或Y将自动进入到新的挂单池,并重新开始统计平均兑换价格,且之前在老的挂单池存入X或者Y的挂单者,只能从老的挂单池里面获取X或Y。
以下是对该过程做具体描述,首先有四个流动性池子Pools:.
Liquidity Pool(流动性池):保持市值比例存放LP存入的X-Y资产做staking。
Maker Pool X(X挂单池):包含X Maker存入的X资产,总量Xm,还有兑换回来的Y资产Ymr,收到的Y币种Maker fee Yfee。
Maker Pool Y(Y挂单池):包含Y Maker存入的Y资产,总量Ym,还有兑换回来的X资产Xmr,收到的X币种Maker fee Xfee。
还有市场参与者,分为四种:
Liquidity Provider(流动性提供者):锁仓获取利息到用户。通过抵押的方式等价值比例的存入两种代币(或多种)到Lquidity Pool,来为CPMM提供流动性支持和价格发现。可以收到部分Taker的收益,但是需要承担无常损失(Ilmpermanent Loss)。
X Maker(X挂单者):要卖出X买入Y的用户。将X注入到Maker Pool X,经过一段时间后,X将会被系统自动按市价兑换成Y。这个兑换过程需要一段时间才能完成,按照Uniswap的流动性估算,大概需要12小时。市价是按照Taker发起交易时的CPMM系统的价格。
当X Maker向Maker Pool X存入X的时候,在合约账户里面记录(Xs,t_x)两个值,Xs指的是X sent,就是下单多少X,t_x是最后一次存入X的时间,用于计算提取的手续费。用户可以任何时候提取合约账户中的Xs或已经兑换完成的Y到自己的钱包地址。
Y Maker(Y挂单者):要卖出Y买入X的用户。将Y注入到Maker Pool Y,经过一段时间后,Y将被系统自动按市价兑换成X。这个兑换过程需要一段时间完成。
当Y Maker向Maker Pool Y存入Y的时候,在合约账户里面记录(Ys,t_y)两个值,Ys指的是Y sent,就是下单多少Y。t_y是最后一次存入Y的时间。
Taker(吃单者):主动发起兑换请求者。
以下为各种操作的过程(这里以Uniswap x*y=k模型为例,也可以用Balancer模型):
Liquid Provider增加流动性addLiquidity(Δx),Liquidity Pool中的X,Y要同比增加
X′=X*(1+α)
Y′=Y*(1+α)
Liquid Provider删除流动性removel iquidity(Δx),Liquidity Pool中的X,Y要同比减少
X′=X*(1-α)
Y′=Y*(1-α)
X Maker增加流动性XMakerDeposit(Δx),Maker Pool X中的Xm要增加,同时修改用户的debt和存入时间(Xs,t_x),如果之前已经有Xs存入还未取出,那么之前的存入时间会被覆盖,手续费奖励会受到影响。注意因为有多个XMaker Pool的存在,所以存入的时候需要获得最新的Pool ld,如果判断用户当前Pool ld不是最新的Pool ld,那么需要先按默认比例为用户完成老的Pool的清算(调用X Maker提取流动性操作),然后再进行存入新Pool的操作。
PId=Current Pool Id
Xm′(PId)=Xm(PId)+Δχ
Xs′=Xs+Δχ
tχ′=Current time
换Pool:在X Maker存入Δx操作之前,首先需要判断是否需要换Pool。发现XMaker Pool里面里面未完成兑换的X价值与已经兑换完成的Ymr价值低于1∶9时,就认为需要换新的X Maker Pool了,为了避免频发切换或者因为某些特殊情况下被误触发切换,可以设置一个最低持续时间,比如一个Maker Pool至少持续使用30分钟(或对应的平均区块数)后才允许触发切换。
if(Xm′s value<1/9Ymr′s value):Current X Pool Id+=1
X Maker提取流动性XMakerWithdraw(Δx,Δy),不需要同比减少,可以只提取一个资产,也可以同时提取一部分X,和一部分Y资产。Maker Pool X中Xm和Ymr都应该减少,用户debt在合约中的记录(Xs)需要减少。Xs最低减为0。提取X资产,没有触发兑换,不收取手续费也不奖励手续费。从Ymr提取Y资产,价格以Ymr历史积累的平均兑换价格price_xy_avg为准,需要支付的手续费跟存入时间有关系,如果存入时间小于池子平均Maker存币时间,需要缴纳手续费,手续费加入到Yfee,如果大与池子平均Maker存币时间,可以获得手续费,手续费取自Yfee。注意需要根据X Maker账号记录的对应的Pool ld去提取流动性,不一定是最新的Maker Pool。
计算总计需要减记的用户debt
Δx′=price_xy_avg*Δy+Δx
下面具体减记和提取操作
Xm′(PId)=Xm(PId)-Δx′
Xs′=Xs-Δx′;only if Δx′<=Xs
Ymr′(PId)=Ymr(PId)-Δy
Yr′=Yr-Δy;only if Δy<=Yr
如果不指定,Δx,Δy比例,默认可以根据X Maker Pool里面已经完成的兑换比例来提取:
(这里可能需要考虑兑换前计算还是兑换后计算,后面需要仔细评估)
计算总计需要减记的用户debt
Δx=σXs
Δy=(1-σ)Xs*price_xy_avg
Δx′=Xs
下面的具体减记和提取操作就一样了:
Xm′(PId)=Xm(PId)-Δx′
Xs′=Xs-Δx′;only if Δx′<=Xs
Ymr′(PId)=Ymr(PId)-Δy
Yr′=Yr-Δy;only if Δy<=Yr
Y Maker增加流动性YMakerDeposit(Δy),Maker Pool Y中的Ym要增加,同时修改用户的debt和存入时间(Ys,t_y),如果之前已经有Ys存入还未取出,那么之前的存入时间会被覆盖,手续费奖励会受到影响。注意因为有多个YMakerPool的存在,所以存入的时候需要获得最新的Pool Id,如果判断用户当前Pool ld不是最新的Pool ld,那么需要先按默认比例为用户完成老的Pool的清算.(调用Y Maker提取流动性操作),然后再进行存入新Pool的操作,注意Current X Pool ld和Current Y Pool ld不一定一致,不能用同一个变量代替。
PId=Current Y Pool Id
Ym′(PId)=Ym(PId)+Δy
Ys′=Ys+Δy
ty′=current time
换Pool:在Y Maker存入Δy操作之前,首先需要判断是否需要换Pool。发现YMaker Pool里面未完成兑换的Y价值与已经兑换完成的Xmr价值低于1∶9时,就认为需要换新的Y Maker Pool了,为了避免频发切换或者因为某些特殊情况下被误触发切换,可以设置一个最低持续时间,比如一个Maker Pool至少持续使用30分钟(或对应的平均区块数)后才允许触发切换。
if(Ym′s value<1/9Xmr′s value):Current Y Pool Id+=1
Y Maker提取流动性YMakerWithdraw(Δy,Δx),不需要同比减少,可以只提取一个资产,也可以同时提取一部分Y和一部分X资产。Maker Pool Y中Ym和Xmr都应该减少,用户debt在合约中的记录(Ys)需要减少。Ys最低减为0。提取Y资产,没有触发兑换,不收取手续费也不奖励手续费。从Xmr提取X资产,价格以Xmr历史积累的平均兑换价格price_yx_avg为准,需要支付的手续费跟存入时间有关系,如果存入时间小于池子平均Maker存币时间,需要缴纳手续费,手续费加入到Xfee,如果大与池子平均Maker存币时间,可以获得手续费,手续费取自Xfee。注意需要根据Y Maker账号记录的对应的Pool ld去提取流动性,不一定是最新的Maker Pool。
计算总计需要减记的用户debt
Δy′=price_yx_avg*Δx+Δy
下面具体减记和提取操作
Ym′(PId)=Ym(PId)-Δy′
Ys′=Ys-Δy′;only if Δy′<=Ys
Xmr′(PId)=Xmr(PId)-Δx
Xr′=Xr-Δx;only if Δx<=Xr
如果不指定,Δx,Δy比例,默认可以根据Y Maker Pool里面已经完成的兑换比例来提取:
(这里可能需要考虑兑换前计算还是兑换后计算,后面需要仔细评估)
计算总计需要减记的用户debt
Δy=σYs
Δx=(1-σ)Ys*price_yx_avg
Δy′=Ys
下面的具体减记和提取操作就一样了:
Ym′(PId)=Ym(PId)-Δy′
Ys′=Ys-Δy′;only if Δy′<=Ys
Xmr′(PId)=Xmr(PId)-Δx
Xr′=Xr-Δx;only if Δx<=Xr
Taker提取流动件
杠杆倍数=n,那么理论上从Liquidity Pool里面提取的量的比例=
从Maker Pool里面提取的量的比例=
γ=1-ρ
ρ是Taker手续费
Taker输入X的量=Δx,最终兑换获得Y的量=Δy
当前Liquidity Pool的价格为:p=x/y
首先从Maker Pool Y里面获得Y,获得的量为(注意这里考虑了手续费):
Δy1=Min(Δx/p*rm,Ym)*γ
完成兑换的X为:
Δx1=p*Δy1/γ
剩余需要兑换的X为:
Δx2=Δx-Δx1
剩余部分全部从Liquidity Pool兑换(跟Uniswap--致):
更新Y Maker Pool的数量:
Ym′=Ym-Δy1/γ
Xmr′=Xmr+Δx1
更新Liquidity Pool的数量:
Y′=Y+Δy2/γ
X′=X+Δx2
Taker输入Y的量=Δx,最终兑换获得X的量=Δx,
当前Liquidity Pool的价格为:p=x/y,
首先从Maker Pool Y里面获得Y,获得的量为(注意这里考虑了手续费):
Δx1=Min(Δy*p*rm,Xm)*γ
完成兑换的X为:
Δy1=Δx1/p/γ
剩余需要兑换的X为:
Δy2=Δy-Δy1
剩余部分全部从Liquidity Pool兑换(跟Uniswap--致):
更新Y Maker Pool的数量:
Xm′=Xm-ΔX1/γ
Ymr′=Ymr+Δy1
更新Liquidity Pool的数量:
X′=X+Δx2/γ
Y′=Y+Δy2
增加一个单独的触发换Maker Pool X的操作接口;
这个接口并不是必须的,但当没有Maker主动出发换Maker Pool操作的时候,可以由任意好心人触发。
收到这个请求是,需要检查确认X Maker Pool里面里面未完成兑换的X价值与已经兑换完成的Ymr价值低于1:9时,就认为需要换新的X Maker Pool,否则不执行操作:
if(Xm′s value<1/9Ymr′s value):Current X Pool Id+=1
增加一个单独的触发换Maker Pool Y的操作接口;
这个接口并不是必须的,但当没有Maker主动出发换Maker Pool操作的时候,可以由任意好心人触发。
收到这个请求是,需要检查确认Y Maker Pool里面里面未完成兑换的Y价值与已经兑换完成的Xmr价值低于1:9时,就认为需要换新的Y Maker Pool,否则不执行操作:
if(Ym′s value<1/9Xmr′s value):Current Y Pool Id+=1
本方法综合了跟Uniswap一样的CPMM(Constant product market makers)协议,可以在不依赖预言机喂价的情况下,自动发现市场价格。但是Uniswap协议没有Maker入口,除了流动性提供者LP之外,其他交易用户都必须成为Taker。对于大交易量交易需求的用户,Taker操作的滑点太大。本方法为Maker用户提供了市价下单的通道,对于交易资金量比较大,不着急立即成交的用户,可以通过Maker接口为市场提供流动性,同时给自己有效降低滑点,并且可以赚取Taker手续费。在不考虑市场涨跌的情况下,可以有效降低Maker用户的成交成本。同时因为Maker的存在,让Taker不止能通过CPMM的LP池(Liquidity Pool)获得流动性,还可以直接跟Maker Pool成交,有效降低滑点。在同等CPMM LP池(LiquidityPool)流动性,并且本方法的Maker Pool充足的情况下,如果设置杠杆率为10,那么Taker的滑点可以降低到之前单纯与CPMM LP池成交的情况的1/10。为了补偿LP的无常损失,Uniswap收取Taker 0.3%的高额手续费造成交易用户的高交易成本。在本协议中,可以设置不同的费率来整体优化Taker的成本。比如每一笔丛Liquidity Pool成交的部分收取0.35%的手续费奖励LP用户以提高他们的积极性,每一笔丛Maker Pool成交的部分收取0.15%的低手续费来降低Taker的成本。因为预期Taker大部分金额是从Maker Pool成交的,因此Taker的整体成本仍然会有显著的下降。理想情况下假设90%的金额通过MakerPool成交,那么Taker的评价手续费可以降低到0.17%。
本方法里面包含的Liquidity Pool的运行机制跟Uniswap,Balancer等协议一致,当执行Taker操作的时候,也可以通过msg调用Uniswap/Balancer的合约完成兑换和获得价格,然后再进行Maker Pool操作,这样可以充分利用Uniswap LP池的流动性。
Liquidity Pool不必像Uniswap一样保持1:1的价值比例,可以像Balancer一样按任意比例设置。
本方法可以部署在不同的区块链上,Ethereum和Tron网络上可以使用智能合约实现。GateChain上可以使用原生代码实现。在GateChain上面的实现可以结合GateChain的普通账户(Regular Account)和保险账户(Vault Account)的特性,将常用交易资金存放在普通账户中,将不常用的大额资金存放在保险账户中,平衡用户的交易需求和安全性要求。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。