第十章:浅谈链上借贷协议

前面两章介绍了Q链上的各类代币协议与自动做市协议,这只是其中一小部分应用。在QSwap出现后不久,链上又诞生了一款爆火的休闲游戏,名为QFarm。它本质是Web2时代“农场游戏”的Web3复刻:用户可以经营自己的农场,种植各类蔬菜并收获果实,且核心游戏数据与交易均在链上完成。游戏中,种植等操作需消耗一种QFarm发行的同质化代币,符号是GEM。为方便玩家交易GEM代币,QFarm还通过QSwap协议创建了专属交易池(由Q币和GEM代币组成)。由于游戏的高热度,GEM代币很快陷入供不应求的状态,价格持续攀升。
有部分玩家在深度参与QFarm游戏的过程中,既享受着经营虚拟农场、收获果实的乐趣,也积累了大量GEM代币。由于看好GEM后续的价格上涨潜力,他们不愿轻易出售手中的“资产”;但与此同时,他们又需要Q币作为消耗品,用于链上其他操作(如参与各类DeFi应用、支付手续费等),陷入了“想持有GEM却缺Q币”的两难。不过,Q链上的一款去中心化借贷协议QLend恰好解决了这一痛点。作为传统借贷机构的Web3去中心化版本,QLend允许用户通过质押链上资产获取所需代币。本章我们就来探讨QLend协议的具体运作机制。
基本原理
在介绍QLend协议之前,我们先简要回顾QSwap协议的核心运作逻辑。QSwap的流动性池由两种配对代币组成,二者相互定价,并遵循“恒定乘积公式”动态调节。流动性提供者(LP)按照当前池内代币的比价,注入对应数量的两种代币,提高池子总锁仓量。他们在承担无偿损失风险的同时,能有效降低其他用户兑换代币时的价格滑点,并可获得协议分配的交易手续费作为补偿和长期收益。而普通用户则通过与流动性池直接交互达成兑换目的,过程中需向协议支付相应费用,这些费用最终会反馈给流动性提供者。
QLend的基本原理和QSwap有一定相似之处,因为它的基本单位也是池子,由两种代币(我们还用X和Y表示)组成。贷款方(Lender)往池子里放入代币X,为池子提供流动性,并赚取利息。借款方(Borrower)往池子里放入代币Y作为抵押,同时借出代币X。一段时间后,借款方连本带利归还池子代币X,拿回自己的代币Y。QLend池子的基本工作原理如下图所示:

这个模型看起来是可以工作的,因为我们生活中的借贷大概也是这样的过程,但是有大量的细节还没有考虑。此外,由于我们是在Q链上通过智能合约来实现这个协议,还有很多额外的问题需要处理。下面我总结一下需要处理的各种问题。
第一,如何查询价格。用户抵押Y,期望借出差不多等值的X。举个例子:如果我们用市值10万的车子做抵押,却只能从银行贷到5千,这样的额度显然难以满足需求,自然不会同意;反过来,要是我们想向银行申请20万贷款,超出抵押物价值的诉求,银行同样不会认可。问题在于,QLend池子如何知道X相对于Y(或反之)的价格呢?
第二,如何处理坏账。就算有途径可以知道价格,这个价格也是在不停波动的。如果某个用户借出X后,他抵押的Y价格大幅下降,导致他资不抵债,怎么办?如果没有一个很好的解决办法,贷款方的利益就会受到损失,就没人愿意提供流动性。
第三,流动性枯竭问题。如果因为需求旺盛导致池子里X被借空,不仅借款方无款可借,贷款方提取自己的代币也会受阻。此外,如果借款方长期不归还X,最终同样会抽干池内流动性,这并非协议期望的结果。
第四,如何确定利率。采用固定借贷利率显然不太合适,更优的方式是根据供需来动态调整利率。当池内可借X充足(借出量少)时,降低利率以鼓励借款;当池内可借X稀缺(需求高)时,提高利率以督促借款方还款。如果采用动态利率,又如何计算利息?
第五,如何分配利息。回顾QSwap协议,其收益(手续费)会随每笔兑换操作即时发放,通过增大恒定乘积公式中的“k值”实现。在此模式下,LP的份额虽不变,但提取资产时能连本带利收回(暂不考虑无偿损失),本质是按份额实时参与收益分配。而QLend的借贷利息需要随时间积累,若仍按QSwap的模式,既不可能频繁发起交易来计算发放利息,又要应对用户随时注入或提取抵押品的需求,肯定是行不通的。那该如何设计利息分配机制呢?
下面我们来看一下QLend协议是怎么解决这问题的。
预言机器
区块链的特性之一是封闭性,也就是说它并不是一个能主动与外界交互的开放系统。既无法主动访问链外数据,也只能通过接收链外发起的交易来改变自身状态。所有运算与状态更新,均基于链上已确认的信息。这种特性虽保障了区块链的安全性与一致性,但也带来了关键的限制:当链上应用需依赖外部信息才能运行时,便会陷入“数据孤岛”困境。
例如,我们设想一个基于区块链的航班延误保险应用。用户购买保险后,如果航班实际延误,智能合约需执行赔付。但问题在于,区块链本身无法直接获取机场的航班状态数据,也无从知晓具体航班是否延误。这类关键的链外信息,必须通过特定机制传递到链上才能被智能合约使用。
这种专门用于将链外数据“搬运”到链上的系统,就是预言机(Oracle)。它本质上是连接区块链与现实世界的中间件,其核心功能是收集、验证并向智能合约提供外部信息。预言机的运作方式多样:既可以由中心化机构维护(比如航空公司通过私钥签名定期上传航班数据),也可以由去中心化自治组织(DAO)通过多方协作验证数据真实性;既可以推送实时价格、天气等动态信息,也能传递事件结果(如选举结果、比赛胜负)等静态数据。
简单来说,预言机就像区块链的“信息网关”,解决了封闭的链上系统与开放的外部世界之间的数据互通问题,为各类需要链外信息的区块链应用(如保险、预测市场、DeFi等)提供了运行基础。区块链与预言机的关系如下图所示:

现在来回答本章第一小节的第一个问题:如何查询X和Y的价格?答案就是通过价格预言机。我们可以假设Q链上已存在各类预言机服务,完全能满足QLend的询价需求。不过再一想,QSwap不就是现成的链上价格预言机吗?毕竟它的作用之一就是通过公式为池内两种代币定价。没错,QLend确实可以用QSwap作为预言机,也可以有其他选择。这属于QLend协议的内部实现细节,我们不做过多的讨论。
超额抵押
第二个问题,怎么处理坏账?答案和现实生活中一样:超额抵押+清算机制。这一小节我们就来讨论这两个保障QLend协议正常运转的核心机制。
回到前面那个在生活中抵押汽车借款的例子。当我们急需用钱,不得已拿着自己心爱的,市值十万的汽车去银行办理抵押贷款时,大概能得到多少借款呢?其实我自己并没有办理过这个业务,但是还是很容易给出一个比较合理的数额的,比如8万。超过十万肯定是不行的,银行不会干这种亏本买卖。而远少于十万我们也就不会去做抵押了,还不如卖掉汽车。
换句话说,我们抵押一个汽车,大概能拿到相当于它的市值80%的借款,这个80%就叫做抵押率(Collateral Factor),这种“抵押品价值高于借款金额”的机制就叫做超额抵押(Over-Collateralization)。通常来说,如果抵押物的价格波动越小,流动性越好,抵押率就越高(比如可以达到90%);反之就越小(例如50%)。
为什么要这样?因为汽车很可能是会随着时间而逐渐贬值的,而银行需要一定的缓冲时间来抵御这个风险。如果这款车很保值,或者短期内用户就把钱还上了,那么银行并没有什么风险。如果我们抵押的汽车以相对较快的速度贬值,那么银行就会保持警惕,最终在它的价值快要低于8万的时候,开始强制对它进行拍卖,预期以略低于8万的价格把它打折卖掉,平掉这笔贷款,而我们也就没车可开了。
这种“当抵押品无法覆盖借款风险时,通过处置抵押品止损”的机制就叫做清算(Liquidation)。而用来界定“抵押品何时开始无法覆盖风险”的阈值比例,就叫做清算率,或者清算系数(Liquidation Factor)。在清算过程中,为了激励清算者(Liquidator)快速参与、确保抵押品能及时变现以收回借款,抵押品会以低于市场公允价的价格被处置。这个“市场公允价与清算处置价之间的差额比例”,就叫做清算折扣(Liquidation Discount)。在任意时间,借款价值与抵押品价值之间的比例叫做贷款价值比(Loan to Value,简称LTV)。以上介绍的一些比例或系数如下图所示:

QLend采用的超额抵押机制和上面讨论的完全一致。当用户把一定数量的Y作为抵押物注入池子后,池子会先通过价格预言机查询Y的当前价格,然后再结合抵押率计算出对应数量的X,借给用户。注意这个过程是由智能合约完成的,所有的步骤都属于一个原子交易。超额抵押的过程如下图所示:

然后假如Y的价格暴跌,任何人都可以作为清算者,去清算那些对系统来说高风险(低于清算率)的仓位。具体过程是这样的:清算者发现一笔可以清算的仓位,然后临时从借贷池中取出这个仓位对应的Y,再按市场价(例如去QSwap兑换池)卖掉得到X。由于清算折扣的存在,清算者可以保留一些X作为自己的收益,将其余的X返回给借贷池。而借贷池会根据价格预言机以及各种预设的参数来校验整个过程。最后,整个清算过程也是一个原子交易,由智能合约完成。清算的过程如下图所示:

那么如果用户一直不还呢?由于用户需要支付的利息越来越多,最终也会导致其达到清算阈值,而被清算。所以为了避免被清算,用户需要在此之前向池子里注入更多的Y(追加保证金),或者连本带利还掉部分或者全部X。这个过程比较简单,就不仔细解释了。
利率模型
以上讲解了QLend借贷池的核心工作机制,也解决了第一小节提出的前两个问题。然而要想知道QLend协议如何高效运转,还需要回到剩下的三个问题。这一小节我们来回答流动性枯竭和利率问题,随后两小节讨论利息计算和分配问题。先来讨论如何确定利率。
前面也说了,借款方超额抵押Y,拿到一定数量的X。然后一段时间后连本带利还给池子X,拿回自己的Y。用户获得了一段时间内X的使用权,但是必须支付相应的利息。而流动性提供者通过牺牲X的使用权换取借款方的利息。最后系统通过折扣的方式鼓励清算者参与清算,在套利的同时帮助系统解决坏账问题。这是整个系统的激励机制。
为了使整个系统高效运行,QLend采取了动态的利率调整机制。简单来说,池子里剩下的X越多,利率就越低;剩下的X越少,利率就越高。当借贷池内有大量的X时,系统会适当降低借贷利率,鼓励借款方借出X。而当池内X变少时,系统会提高借贷利率,督促借款方尽快归还X。所以,借贷利率实际上是根据市场供需来调整的。当市场需要更多的X的时候,借款的人自然就会变多,利率就会上涨,反之就会下降。我们把X已借出数量和X总供应数量的比例叫做借贷池的利用率(Utilization Ratio)。总体而言,我们希望一个运作良好的借贷池保持一个较高的资金利用率,例如80%。
那么该如何解决流动性枯竭问题?这一问题不仅会导致借款方无币可借,更严重的是会让贷款方(即流动性提供者)无法提取自身注入的X(流动性)。这种“资金锁死”的风险,会直接打消用户参与流动性提供的积极性,对协议长期运转造成冲击。
你可能会想,那就加一道硬性的闸门好了:利用率一旦超过某个数值,就不许再借款。这个办法当然可行,但是太生硬了,而且它只拦得住新的借款,对已经借出去的X无能为力。QLend采用的是一个更巧妙的办法:让利率曲线拐个弯。具体来说,协议会预设一个最优利用率,比如80%。在这个点以下,利率随着利用率缓慢爬升;一旦越过这个点,利率就陡然飙升。我们把利率曲线上的这个转折点叫做拐点(Kink)。
拐点之后的高利率会同时从三个方向起作用:打算借款的人会被高昂的利息劝退,已经借了款的人会急着还钱,而丰厚的利息收益又会吸引新的贷款方注入X。三股力量合在一起,把利用率重新拉回拐点附近。整个过程不需要任何人干预,全靠利率自动调节,这也正是把利率和利用率绑在一起的意义所在。
顺便说一下,借款方支付的利息并不会全部落到贷款方手里。协议会先从中抽走一小部分,存进一个专门的储备金账户,用来应对坏账等意外情况,剩下的才分给贷款方。这个抽成的比例就叫做储备系数(Reserve Factor)。
还有一点要说明,通常在借贷场景中,借款利率和贷款利率是存在差异的,但为了更清晰直观地阐述QLend协议的核心运作逻辑,这里关于利率的细节我们就不做深入讨论了。那么利率究竟在何时调整呢?答案是:只要借贷池的资金利用率发生变动,协议就会自动同步调整利率,无需人工干预。下面这张表,对前面提到的交互逻辑以及对资金利用率的影响进行了梳理总结:
| 交互 | 可借(X) | 已借出(X) | 抵押(Y) | 资金利用率 |
|---|---|---|---|---|
| 添加流动性 | 增加 | 不变 | 不变 | 下降 |
| 减少流动性 | 减少 | 不变 | 不变 | 上升 |
| 借款 | 减少 | 增加 | 增加 | 上升 |
| 追加保证金 | 不变 | 不变 | 增加 | 不变 |
| 还款 | 增加 | 减少 | 减少 | 下降 |
| 清算 | 增加 | 减少 | 减少 | 下降 |
利息计算
利息的计算和分配逻辑在实现上比表面更复杂,这里我们只做简化说明。当借款方从QLend借贷池借出代币后,就需要承担支付利息的义务。QLend采用的是“利息随时间持续累积”的机制,而且累积的速度会跟着借贷池的资金利用率动态调整。利用率变了,利息的计算标准也会同步变化。
需要特别说明的是,QLend并非采用“每区块都更新利息”的模式,其智能合约用的是“惰性复利”机制。协议会维护两个全局的利率累积系数(也叫“利息指数”),一个对应借款方,一个对应贷款方。只有当用户执行借贷池相关操作(比如借款、还款、存入资金、提取资金)时,合约才会根据“从上一次操作到现在经过的区块数量”,算出这段时间里该累积的利息,再一次性更新这两个指数。
这种设计很巧妙,既没丢“按区块精确计息”的核心逻辑,又避免了每个区块都跑计算带来的高额成本。如果想更轻松理解,我们可以做个线性近似:
其中 x 为借出金额,r 为年化利率(Annual Percentage Rate,简称APR),t 为借款时长(以年计)。例如张三从池中借出1000个Q币,年化利率为10%,借款90天(90/365≈0.2466年),则约需支付利息1000×10%×0.2466≈24.66个Q币。
在实际运行中,QLend会按照区块间的时间间隔精确累积利息,因此结果会略高于这个简单估算。当借款方还款时,需要连本带利归还代币。如果逾期未还,利息会继续复利增长,同时抵押品的清算风险也会逐步升高。
利息分配
最后一个问题:借款方付的利息,怎么分给贷款方?
最直接的想法当然是按时打款,比如每天给每个贷款方的账户里打一笔。但你马上会发现这行不通。链上的每一笔转账都要花燃料费,池子里要是有一万个贷款方,光是发利息就能把收益烧光。何况大家随时可能存入或者取出,份额一直在变,到底该按哪个时刻的份额来算呢?
QLend的解法很巧妙:干脆不发利息。
当你往借贷池里存入资产的时候,协议不会简单地记一笔“某某存了多少钱”,而是给你铸造一批存款凭证代币,用来代表你在池子里占的份额。在QLend里,这种代币叫做qToken。每一种底层资产都有自己对应的凭证代币,比如你存Q币拿到的是qQ,存GEM拿到的是qGEM。凭证代币和底层资产之间有一个兑换比例,我们把它叫做兑换率(Exchange Rate)。
关键就在这个兑换率上。它的计算公式我们不展开,只要知道一点:它只会往上走,不会往下走。道理也很简单,借款方在源源不断地付利息,池子里的资产总量一直在变多,而凭证代币的数量却没有变。同样多的凭证,能换回来的底层资产自然越来越多。利息的分配,就藏在兑换率的这个爬升里。
举个例子。李四往QLend借贷池里存了5000个Q币,当时的兑换率是1个qQ兑10个Q币,于是他拿到500个qQ。过了一段时间,借款方付的利息把兑换率推高到了1个qQ兑10.5个Q币。这时候李四手里那500个qQ能换回5250个Q币,多出来的250个就是他的利息收益。整个过程中,协议一次“发利息”的动作都没做过。
这个办法有几个好处。第一,全自动。利息跟着兑换率自己往上涨,不需要任何人发起交易去派发。第二,绝对公平。你能分到多少,严格按你手里凭证代币的数量来算,一分不多一分不少。第三,还能拿去别处用。qToken本身就是一个普通的FT代币,你可以把它转给别人,也可以拿它去别的DeFi协议里当抵押品,相当于一边收着利息,一边还能用这笔钱去做别的事。第四,几乎不花钱。协议只在有人操作池子的时候才顺手更新一下兑换率这类全局变量,用不着每个区块都结算一遍。
于是,一个不需要任何中心化机构来清算和派发的利息系统,就这样跑起来了。
本章小结
本章以QLend为例简要介绍了Q链借贷协议的核心定位与基本工作原理,重点拆解了支撑协议运行的关键机制:包括为抵押品定价的价格预言机、保障资金安全的超额抵押与清算机制、平衡供需的动态利率模型,以及利息的计算逻辑与分配规则。这些机制共同实现了贷款方与借款方的需求匹配,也为Q链生态的资金流转提供了安全保障。
在各类代币、链游,以及QSwap、QLend为代表的DeFi应用的共同推动下,Q链生态一路火热,发展到了前所未有的顶峰,而Q币和GEM等一众代币的价格也纷纷创下历史新高(All-Time High,简称ATH)。一时间,网络上的各路“英豪”(Key Opinion Leader,简称KOL)纷纷高呼“区块链革命”的口号,渲染着狂热氛围。另一方面,很多人也害怕错过这波看似能轻松盈利的浪潮,FOMO(Fear of Missing Out,即“错失恐惧症”)情绪在市场中迅速蔓延,不少人哪怕对项目逻辑一知半解,也急着跟风入场,生怕自己成为“被抛下的人”。但很少有人注意到,链上市场同样受“看不见的手”调控。一场前所未有的大回调与行业萧条,已在悄然酝酿。