在关注性公链能问题之余,我们还需要注意到像交易手续费这种,可能会发展成为区块链进步的阿喀琉斯之踵的细节设计。 原文标题:《被公链们遗忘的加油站 —— DeFi 发展的重大隐患之一》 TPS 无法包治百病在「黑色星期四」的事件发生后,不少公链也在各种采访或文稿中提到了这一问题,分析自己的公链项目在性能上大幅优于以太坊,因此在自家公链上发展的 DeFi 生态不会面临和以太坊一样的流动性危机。 诚然,从以太坊 20 TPS 到现在诸多公链 1000-3000 TPS (我们先假设这些公链拥有和以太坊相同的安全性,当然这样的假设多数情况下是站不住脚的),有了近五十到数百倍的提升,交易处理量和交易处理速度都有了显著提升。 但如果 DeFi 生态的资产和用户数量通用增长五十到数百倍,试问这些公链会处理地比以太坊更好吗? 要知道我们当前所讨论的 DeFi 生态还只是一个襁褓中的孩子,如果 DeFi 是一条正确的道路,我们未来将面临的是数万亿的资产,数千万乃至数亿级的用户量。 我想到那个时候,我们需要思考的是一些比 TPS 更深刻的内容。 如果黑天鹅事件注定会发生,我们如何将这一过程处理地更加妥善,通过一些更加完善的规则和流程,让更多的人尽可能地减少损失,这才是我们真正需要去思考和改善的内容。 DeFi 「崩溃」 在哪里?让我们先来回顾一下这次 DeFi 系统面临「崩溃」的来龙去脉: 众所周知,当前 DeFi 生态大部分都构建在以太坊上,而目前的 DeFi 生态以抵押借贷为主,占比超过 70%,3 月 12 日在以太坊价格暴跌之后,继而引发众多 DeFi 借贷协议中的抵押品价格迅速下滑,触及警戒线,进而面临大规模的清算。 此时,众多 DeFi 用户为了防止资产被清算,就需要进行补仓,也就是向借贷协议中转入更多的抵押品,抬高抵押率,防止被清算。如果不进行补仓,那么抵押品就会面临清算,抵押品将被强制打折拍卖。 这两者共同造成了以太坊上交易量激增,网络堵塞,Gas 价格大幅飙升。 如果你也经历了「黑色星期四」,我想你会经历下面两个非常实际的情况: 情况 1:我想发一笔交易,但是因为网络拥堵,交易手续费波动异常,我不知道需要设置多少交易手续费比较合适。设置低了,可能手续费消耗完了交易却没有发出去;设置高了,又心疼这白花花的钱。 情况 2:我钱包内有足够多的资产(USDT,DAI 等等),但是我并没有足够多的以太坊(日常使用足矣,但 Gas 价格暴涨时显然是不够的),我发现此时我无法完成转账,因为我没有足够的以太坊去支付手续费。 此时我可以从别的地方转入以太坊,但需要支付一笔额外的高昂交易手续费;而如果我的以太坊目前在交易所中,那基本可以放弃了,因为交易所此时已经禁止提币了。 交易手续费的设计,可能是我们一直忽略的阿喀琉斯之踵。
我们还有解决方案吗?情况 1:手续费应该如何计算?熟悉以太坊的小伙伴应该都知道,在以太坊上转账或者执行合约都需要燃烧 Gas,而 Gas 由两部组成 Gas Limit 和 Gas Price,前者体现了这笔交易消耗了以太坊这台虚拟世界计算机的资源的量(比如多少 CPU 时间之类),后者体现了这笔交易消耗的资源的量的单位价格(比如每单位 CPU 时间值多少以太币)。 当然实际是,在一个交易中,真正消耗的 Gas 费不一定是你输入的 Gas Limit * Gas Price,而应该是 Gas Used By Txn * Gas Price,交易使用的 Gas 乘以 Gas Price。 我们用开车来打个比方,比如你出去旅行一趟,你在车里面加入了 50 升汽油(Gas Limit),过程中耗油 20 升(Gas Used By Txn),当前油价每升 6 元。 最初显示你需要支付的燃油费是(50 升 * 6 元每升 = 300 元),然而最终你这次旅行的燃油成本是(20 升 * 6 元每升 = 120 元),因此多余的汽油费会退还给你。 问题就出现了,在以太坊网络不太好的时候,转账的时候总是会提示 「Warning! Error encountered during contract execution [Out of gas]」 翻译过来就是合约执行出错,这是由于 Gas 费设置太低导致的交易失败,你可能需要调高你设置的 Gas Price 和 Gas Limit。 注意,在以太坊中转账失败时,转账金额会退回原账户,然而手续费不退。 拿上面开车的例子继续说,此次旅程应该是需要消耗 20 升汽油,但是你只加了 10 升汽油(Gas Limit),这点汽油不够你跑完全程,必然是半路抛锚。但是在以太坊中,其实你并非是半路抛锚,而是你会打回原点,这似乎和开车的场景有些不相符合,但你又说不出来问题出在哪里,这个我们后面再谈。 再来看看某著名跨链项目在这方面的设计,总体设计和以太坊类似,燃料费因为会根据每笔交易的执行逻辑而更改,因此在交易发送出去前难以计算。 如果你没有设置足够的燃料费,交易会失败,当然燃料费也不会再退还给你。也就是说,你消耗了这部分燃料费,但是没有交易成功(这一部分其实和以太坊基本类似)。 但是如果你设置的燃料费设置过高,交易会成功,但高于设定值的燃料费不会退还给你(在以太坊中,多出的燃料费是退还的,可以说从这个角度看此著名跨链项目要比以太坊还坑啊)。 这听上去更疯狂了。 要是这样的链上发生了拥堵,设置手续费的过程俨然成了一个斗兽场的游戏。 我们需要更确定的手续费通过手续费去进行交易排序,矿工优先打包较高手续费的交易,这无可厚非。 但是我们需要更精确更确定的交易手续费计算方式。 以太坊和类似的一些项目出现这种非确定性手续费的原因是因为,它们将区块链包装成了一台世界计算机,将逻辑的计算和执行扔给每一个节点,又因为采用了 EVM,WASM 等基于 x86 架构的虚拟机,无法在交易前精准地衡量每一步计算所消耗的资源,因此设置了 Gas Limit。 而在 CKB 中,采用的是链下计算,链上验证的模式,区块链更像是一个法官,只要这笔交易经过验证,符合相关规则,交易就可以上链。 这也意味着,在交易发出之前,交易前后的状态变化就是已知的。这样我们就可以准确的判断这笔交易在验证中,需要消耗哪些资源。 另外 CKB 虚拟机采用的是开源的 RISC-V 指令集,它第一个被设计成可以根据具体场景可以选择适合的指令集的指令集架构,这使得 CKB 虚拟机更像是一个真实运行的 CPU,而非传统的虚拟机。
基于 RISC-V 的 CKB 虚拟机,会将每一步计算操作,转换为最最基础的指令,此时我们只需要为每一个指令指定特定的需要消耗的资源,这样我们任何一笔转账交易、合约调用都是可以很明确的计算出需要消耗多少资源(这在 CKB 中叫做 Cycles)。 因此在 CKB 上转账,只有一个可调节的变量,你只需设置 Gas Prices,而无需在乎 Gas Limit。Gas Limit 这个在以太坊等区块链中是一个变量,而在 CKB 中是一个可提前计算的确定值。 CKB 的交易手续费 = Cycles (交易构造完即为固定值)* Gas Prices Per Cycle (每个 cycle 的 Gas price) 拿上面开车的例子继续说,转账就像是一场旅行,起点和终点都是确定的,那么行驶的距离就是确定的,自然耗油量也是确定的,因为区块链的世界里,你不会走岔路。 在这个情况下,你只需去考虑加什么价格的油就好了,加柴油等于开上了拖拉机,加汽油等于坐上了小汽车,加航天用油等于开上了大飞机。只要你 Gas Prices 设置的够高,矿工们分分钟把你服务地舒舒服服的。 这下就简单了,如果你想让你的交易快速被打包,你只需要提高 Gas Prices 即可,出价高的交易自然就排前面,是不是好理解多了。 当 CKB 出现网络拥堵时会发生什么呢? 你发送了一笔 Gas Prices 比较低的交易,迟迟无法被打包,此时你只需要再发送一笔交易,设置更高的 Gas Prices,让后面这笔交易优先被打包即可。 而之前低手续费的交易在节点验证时,就会失效,这部分交易手续费也就没有被消耗掉。 当然你根本不用担心双花的问题,因为在你掌握全网 51% 算力前,你还不具备双花的钞能力。 一场惬意的旅行,偶遇半路抛锚,需要的是及时的救援,而非打回原点。 情况 2: 什么可以充当手续费?目前市面上大部分公链发行的原生代币最主要的实际使用功能都是当作交易手续费,通过交易手续费去捕获生态价值,但是这一模式能否真正捕获生态价值,尚未有明确结论。 而在「对 Layer 2 友好的 Layer1 原生代币」中,我们发现了这样的问题,在分层架构下,Layer 2 技术使得大量交易可以在 Layer 2 上快速、高效、低价地执行,势必会减少 Layer 1 上的交易和手续费。Layer 2 需要 Layer 1 作为安全保障,但本身的发展却损害了 Layer 1 的安全性。使用手续费作为矿工奖励使得 Layer 1 和 Layer 2 之间变为零和游戏。 所以我们认为 Layer 1 公链在切割交易功能到上层后,应抛弃用燃料费作为主要收费,转而提供其他的服务 , 并以此作为原生代币的新需求,只有这样才可以为代币注入更多的价值。 这可能听上去有一些难以理解,我们举个非常常见的例子,我们想从一个交易所转一笔 USDT 到另外一个交易所。 我们目前主要有三种选择 Onmi USDT、ERC20 USDT、TRC20 USDT,你会选择哪一种呢? 大部分情况下,我们现在可能会选择 ERC20 USDT,但是如果你用过 TRC20 USDT,你会感觉,真香!零手续,还可以纵享丝滑,谁人不爱。(这里并非给 Tron 打广告,单纯地陈述事实) 你是不是想说 Tron 不够安全? 但是你会发现,在资金量不大的时候,我们对安全的需求也并没有那么高,「这叫交易结算保证,小傻瓜」一文已经将这个问题阐述的非常清楚了。 回到应该始终坚持安全和去中心化的 Layer1上(Tron 显然不在这个定义范围内),我们该提供什么样的手续费服务? 我们需要更多样的手续费我们需要提供交易手续费代付服务,需要提供可以使用其他代币支付交易手续费的服务,以太坊的生态系统显然已经意识到了这方面的重要性。
不管使用什么方法做到无 ETH 燃料转账,主要利用的就是「补贴」、「中介」、「生息补偿」这三种方法。 但是我们需要清楚地认识到,这些解决方案并没有改变 ETH 是以太坊网络唯一的交易手续费代币这一事实,我们只是通过各种手段来进行掩盖,包装罢了。 而且这些解决方案,目前并未在此次的 DeFi 危机中,并没有起到解决问题的作用。 在 CKB 中,CKB 作为原生代币抛弃了对于交易手续费的强绑定,任何一种用户自定义代币都可以作为交易手续费。 再进一步,通过 Open Transaction,CKB 上还可以实现:任何人可以用任何用户自定义代币替任何人支付交易收费。 这里就不再展开了,想了解更多关于 Open Transaction 的小伙伴可以 前往这里 了解更多。 在这样的设计下,你再也不会遇到有币,却也无法发送交易的尴尬局面了。 总结性能瓶颈,确实是当前区块链世界面临的重大问题之一,但是那些拥有数千 TPS,觉得这样的性能就已经完全可以解决我们正在面临的性能问题的公链们需要醒一醒了。 目前分层、分片、跨链等等都是我们目前正在探索的可以解决扩展性的方向,我们也需要认识到,我们还有很长的路要走。 在关注性能问题之余,我们还需要注意到像交易手续费这种,可能会发展成为区块链进步的阿喀琉斯之踵的这些细节上的设计。 交易手续费的确定性和可以任何人使用任意代币支付手续费等众多底层组件上的进步,才是真正能够 make public blockchain great again 的重要技术之一。 (责任编辑:admin1) |