【译】Economics of Fees and Gas

以太坊(和Qtum )的天然气基本上是智能合约中的一项作业成本。 不同的操作有不同的成本。 有些非常便宜,有些并不便宜。 这种机制基本上是阻止某些行为的一种方式,也可以使垃圾邮件和对区块链的攻击更加昂贵。 在Turing-Complete计算机中,这种气体概念是绝对必需的。 否则,有人可以简单地写一个无限循环,并观察区块链停下来。

今天我将特别讨论气体模型在特定条件下鼓励什么样的事情,以及这种事情的一些意想不到的后果。

存储成本

因此,永久存储是以太坊区块链中最昂贵的资源。 将任何大量数据存储在区块链中是完全不切实际的。 在当前的网络环境下,1Kb的数据大约是2.50美元,具体取决于您希望确认的速度。 这意味着1Mb超过$ 2,000。 因此,将任何重要数据存储在区块链中都是不切实际的。 但是,这是针对传统存储的。 Ethereum的框架有非传统的替代方案。 我将介绍总共5种存储方式,以及各种行为,成本和收益:

外部代码

这基本上就是您在Ethereum中使用CREATE操作码创建新合同帐户的原因。 您可以将所需的任何数据存储为新创建的合同的合同字节码。 这可能是将数据存储在区块链上最浪费的方式,因为一旦存储数据,就很少有动机在数据不再需要时包含数据。

这是一种半易失性存储方法。 一旦数据被存储,它就不能被更新,而不需要从新创建。 对于大型数据块来说,最好不要在以后更新,或者只需要非常少地更新。 加载这些数据一次写入就会非常便宜,将传统存储打了一个数量级。

内部代码

对于某些用例而言,这是一个明显的选择,并在Solidity生成的字节码内部使用。 基本上,如果有一些数据可以在构造函数和缓存中生成,那么计算它通常便宜得多,然后直接将其存储在部署的合约字节码中,而不是将大量数据包含在创建事务本身中。 假设数据不需要更新,这是最好的使用方法,因为它也是加载数据的最便宜方式。

存储

这是由Ethereum提供的传统存储模型。 它细化,允许每个单独的32字节字在存储中更新,与写入新存储相比,降低了更新成本。 也有一些激励措施来保持这个区域干净整洁,因为清理仓库实际上可以为合同提供天然气津贴。 这个区域很容易更新,易于阅读,但在大多数情况下是访问和写入最昂贵的方法。

交易

这是一种完全不稳定的数据存储方法,尽管它实际上不存储合同可直接访问的持久数据。 不是将数据存储在EVM本身内,而是通过发送合同数据将数据提供给合同。 合约然后散列数据以确保它是正确的并且匹配预期的合同状态。 这种方法有一些缺点,最大的缺点是交易数据非常昂贵。 它是迄今为止“访问”中最昂贵的,这要求将数据放在一个调用合同的交易中。 然而,它也是实际“写入”和更新的最便宜的(除内部代码之外),因为它实际上并不存储在区块链本身中。 此方法可以扩展为使用类似结构的散列树,以便提供给合同的数据非常细化,从而减少浪费宝贵的交易空间。 但是,这种方法也有一个主要缺点。 数据竞赛必须考虑在内。 如果另一个用户向合同发送调用,导致数据更新,那么它会使任何未决事务中的数据无效。 这与数据访问的大量昂贵成本一起严重限制了此方法的潜在用例。

那么,这些方法如何综合成本呢?

请注意,“实际”交易成本与其他方法一起显示。 这基本上是用多少数量的数据实际调用合同的成本。

数据访问

数据访问与交易

数据初始存储

数据更新存储

这些图表为我们清楚了一些事情:

  • 对于任何大于128字节的数据,外部代码都是可取的,这些数据永远不需要更新
  • 内部代码应该随时使用纯粹的常量数据,并且在部署时已知
  • 存储应该用于任何通常更新的数据
  • 交易数据在某些情况下是可用的,尽管有些比赛,但如果不止一次使用合同,总体成本很快就会变得非常高。

存储经济学

关于背后的博弈论和经济学的话题,整体区块链是否更好地将非易失性数据存储在合同字节码中而非存储数据库中? 我想这取决于几个因素。 随着更多账户被创建,访问账户数据变得更加昂贵吗? 我没有答案,但我可以保证使用这种方法进行易失性存储不仅更昂贵,而且有点浪费。 我的图表包括基本上部署新合同的成本,但是从燃气成本中扣除销毁约19000天然气的旧数据合同给出的退款。 这确实对图表左侧的图形产生了可测量的影响,但在约320字节之后,除了成为一个好的区块链公民之外,它变得毫无意义。

那么,合约存储的缺点是如此昂贵? 主要缺点是它可能会鼓励执行可能更便宜的数据计算,这些计算实际上需要更多时间来执行,以防止将存储用作缓存层。

这些成本在某些情况下也会鼓励在每笔交易中发送数据。 这可能是最有害的条件。 存储合同数据的数据库在某些方面实际上是协议级别的区块链的免费资源。 除了SPV(Qtum)或“快速”(以太坊)同步方法之外,此数据库的大小与实际区块链的大小以及处理需要多长时间无关。 最后这个数据库的大小被折叠成一个叫做stateRootHash的单个256位SHA3哈希。 可以说,区块链最直接的资源成本不是这种存储,而是所有附加到交易的数据。 如果没有某些安全隐患,此交易数据不能被丢弃或忽略。

对于存在于Qtum中的轻量级钱包和节点,实际上对于整体用户体验而言,将数据存储在帐户字节码数据中而不是直接存储在存储器中会更加不利。 检索和验证与单个帐户关联的所有存储很容易。 但是,如果此合同为了数据目的而访问多个单独帐户,那么这是一个完全不确定的过程,会造成严重的延迟。 在不下载所有合同字节码的情况下,不可能一次性检索和验证这些数据。 所以,你必须开始执行合同,然后返回到网络,检索另一个帐户,验证它等等,然后最终继续执行。 对于这样的1份数据合同,可能没有太大的影响,但由于这些数据的便宜性,除了固定的32,000天然气平台创建费外,没有使用多个合同没有明显的好处。 事实上,在某个特定点之后,特别是对于半挥发性数据,我们极力鼓励将这些数据保持在细粒度。

因此,基本上存储的高成本源于保持区块链易于与轻量级钱包进行交互的需要。 但是,合同开发人员可以使用这条路线来规避这种成本,并且伤害轻量级钱包比直接将大量数据直接存储在存储中更受影响。

计算成本

现在让我们来谈谈以太坊天然气模型的不太明显的开支。 几乎每个计算操作码都有一些相关的成本。 这些成本远远低于存储或直接资源,但是在EVM中执行基本操作需要多少操作码,这些成本会快速增加。 我最喜欢的例子之一是比较两个字符串以确定它们是否相等的代价。 所以,我构建了这个基本的测试合同:

 contract GasTest{ using strings for *; function StringUtilsEqual(string tmp1, string tmp2) constant returns (bool){ return StringUtils.equal(tmp1, tmp2); } function SliceEquals(string tmp1, string tmp2) constant returns (bool){ return tmp1.toSlice().equals(tmp2.toSlice()); } function NaiveEquals(string tmp1, string tmp2) constant returns (bool){ if(bytes(tmp1).length != bytes(tmp2).length) return false; uint256 max=bytes(tmp1).length; for(uint256 i=0;i<max;i++){ if(bytes(tmp1)[i] != bytes(tmp2)[i]){ return false; } } return true; } function Sha3Equals(string tmp1, string tmp2) constant returns (bool){ return sha3(tmp1) == sha3(tmp2); } } 

这测量比较字符串的气体成本4种方式:

  1. 使用StringUtils库
  2. 使用StringSlice库
  3. 使用天真的循环方法来比较字符串是否相等
  4. 使用两个SHA3操作对字符串进行散列,然后比较散列是否相等

在我进入图表之前,普通计算机上最慢的方法是SHA3方法。 SHA3​​价格便宜,但即使使用非常优化的库和快速机器,它也会在0.028s或28ms内散列大约100个字节。这意味着2个散列大约需要64ms。 同时,比较(旧)64位处理器上的2个字符串大约需要0.00183s或0.0183ms。 如果我们基于天然气成本计算和执行操作需要多长时间,则使用传统方法比较2个字符串应该会更便宜。 所以,下面是这些不同方法的气体成本图:

严格的天然气成本

外卖

所以,在这一点上,我认为预计我会谈论以太坊的天然气日程表是多么的可怕。 但是,不,问题不在于使用的值,而在于整个模型。 我不会假装知道这个问题的一些完美答案。 这绝对是一个复杂的。

如果您曾经研究过英特尔手册,这些手册描述了台式机x86处理器中各种操作码的操作和时序,然后去测量这些操作码的实际性能,那么记录的时序和实际时序之间的比较就会变化。 。 很多。 这是因为现代处理器是非常复杂和优化的硅片。 有多个流水线,缓存级别,分支预测器,寄存器缓存集等。基本上,所有这些都允许一组可能需要1ms的操作码,在紧密的循环中操作,并在2ms内执行100次操作,而是超过100ms。 这种复杂的缓存,管道和分支预测结构显然不可能在孤立的虚拟机中表示。 气体模型必须适用于各种处理器,包括不同体系结构的处理器,以及不同的位数(即64位与32位)。 所以,气体模型最好是适用于所有处理器的近似值。

然而,尽管没有可能的完美解决方案,但我肯定有一些想法可以改善这种情况,这些都是我将在为Qtum中x86虚拟机的气体模型设计(2018年即将开始!

丰富和可预测的标准库

提供丰富的标准库和定价气体可能是在没有大量风险的情况下立即改善情况的最佳途径之一。 这个标准库不需要在没有虚拟机的情况下实际执行,但如果虚拟机足够有效,就没有任何伤害。 重要的是执行该功能所需的气体速率应该由合理的人来设定。 这允许测量分支预测和缓存等事情,并因此直接考虑到天然气价格。 以太坊为一组非常有限的操作(如SHA3)执行此操作。 SHA3​​的基本成本是30瓦斯,然后每个32字节数据字的3瓦斯散列。 所以,可以想象一个内置的StringEqual操作,它可能有5个气体的基本气体成本,然后每个字节比较1个气体。

这种方法最大的问题是使用以太坊模式,这需要使用预编译的合同或添加新的EVM操作码。 在x86虚拟机中,我想能够使用本地x86代码(可能在内部进行预编译),然后以某种方式检测虚拟机何时进入这个“特殊气体”内存区域。 这绝对是一个想法。 但是增加和改变这些操作的成本将需要分叉或其他网络中断。 Qtum在这方面的一大优势是,我们可以扩展分散治理协议来涵盖这一功能,以便轻松调整这些操作的基本成本和费率成本。 然而,在这种专门的天然气成本模型下添加新功能的方式仍然是一个正在进行的问题。

分支和内存的成本,而不是操作码

一种可能是前进方向的想法是不收取操作码,而是收取分支和内存访问费用。 这种方法背后的主要观点是大多数操作速度非常快,时间差异不明显,因此大多数操作可能具有固定成本或甚至零成本。 然后,唯一的代价是分支(可能只有后向分支)和内存分配。 现代处理器上最昂贵的操作不是明确的操作码,而是缓存未命中和错误预测的分支。 因此,这种模式旨在在任何可能的时候为这些条件收取一笔摊销成本。 这将极大地鼓励循环展开,这在某些条件下更快......有时。 如果循环展开过多,则由于填充缓存而导致性能下降,但展开循环的额外存储成本可能会超过此压力。

这种方法需要大量的研究来确定它是否可行,哪些边缘案例需要特别关注。 这种方法的主要优点是与当前的模型相比,可以使燃气成本变得非常可预测。 我相信这种模式本身并不是一个可行的解决方案,但将这一概念与另一种天然气概念相结合可以为智能合同开发人员带来可预测性。

包括气体模型中的宏观操作

由于现代编译器生成的代码如此之多(即他们找出了编译常见操作的最有效的方法),将不仅包括原始操作码纳入气体模型,而且还包括一系列“宏观操作”。 这些宏观经营需要仔细评估和定价,并用一种​​方法来预测其执行的时间成本。 困难的部分是,通用执行环境非常不稳定,完全预测时间成本可能几乎不可能。 然而,这个模型中的任何漏洞都是潜在的攻击者可用的DoS攻击。

所有这一切的问题

在某个时候,通过在区块链共识系统中放置越来越多的代码,以便正确测量执行的真实资源成本,实际上您会比执行代码花费更多的时间。 这是一般气体模型中最难的问题之一。 您希望能够在各种实现中保持一致的一致性,同时还能防止廉价的攻击,并且最终对各种虚拟机优化(包括预编译和JIT执行)都很友好。 这些方面聚集在一起,真正形成了整个话题中最困难的部分。 这绝对是它仍然是一个开放性研究问题的原因之一。 图灵完备性的问题在于,在实际执行智能合约之前,不可能测量智能合约的成本。 最好的办法是测量各种代码,然后你至少可以知道一段代码的天然气价格,直到下一个分支。 这实际上是智能合约x86架构的弱点之一。 代码是数据,可以被突变和覆盖。 在最终的实现中,最终可能会有更好的混合气体模型,这样内部恒定的(即像EVM代码那样加载的)字节码具有更强大的模型,但是随后代码将以读写方式动态加载和执行,执行内存使用的计算成本较低(尽管不太精确/经济上较昂贵)可以即时使用的气体模型。

结论

天然气很难,没有银弹,区块链很难。

笔记

燃气成本计算:

 memory(size) = 3 * (size/32) + (size/32) * (size/32) / 512 # Gas costs of loading existing data in EVM (assuming memory is already allocated) (not accounting for memory costs to store the data in) ## external code (semi-volatile) 200 + 700 + (3 * size) sload + extcodecopy + (copy * size) ## internal code (constant) 3 * size copy * size ## storage (mutable) 200 * size sload * size ## Transaction (mutable) 200 + (68 * (size * 32)) + 30 + (6 * size) ## note: zero data is only 4 gas sload + (txnonzeroByte * (size * 32)) + sha3 + (sha3word * size) # Gas costs of storing data initially to EVM (not accounting for memory costs data is initially stored in) ## external code (semi-volatile) 32000 + 20000 + (200 * size * 32) + memory(size) + 10 create + sstore + (createByte * (size * 32)) + memory(size) + overhead ## internal code (constant) (200 * (size * 32)) (createByte * (size * 32)) ## storage (mutable) 20000 * size sstore * size ## Transaction (mutable) 20000 + 30 + (6 * size) ## note: zero data is only 4 gas sstore + sha3 + (sha3word * size) # Gas costs of updating data in EVM (not accounting for memory costs of updated data to store) ## external code (semi-volatile) 32000 + 5000 + (200 * size * 32) + memory(size) + 10 create + sstoreReset + (createByte * (size * 32)) + memory(size) + overhead ## internal code (constant) N/A (technically could be possible, but would greatly complicated contract design) ## storage (mutable) 5000 * size sstoreReset * size ## Transaction (mutable) 5000 + 30 + (6 * size) ## note: zero data is only 4 gas sstoreReset + sha3 + (sha3word * size) 

测试合约字节码,包括库等:

6060604052341561000f57600080fd5b610f488061001e6000396000f30060606040523615610081576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633a96fdd71461008657806346bdca9a1461013a5780635d62fdf5146101f2578063674ff51b146102aa57806388ee0b2a146103625780638a0807b71461041a578063ef5a8374146104ce575b600080fd5b341561009157600080fd5b610124600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610586565b6040518082815260200191505060405180910390f35b341561014557600080fd5b6101d8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061084a565b604051808215151515815260200191505060405180910390f35b34156101fd57600080fd5b610290600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610860565b604051808215151515815260200191505060405180910390f35b34156102b557600080fd5b610348600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610874565b604051808215151515815260200191505060405180910390f35b341561036d57600080fd5b610400600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506108a1565b604051808215151515815260200191505060405180910390f35b341561042557600080fd5b6104b8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506109eb565b6040518082815260200191505060405180910390f35b34156104d957600080fd5b61056c600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610d17565b604051808215151515815260200191505060405180910390f35b6000610590610eee565b610598610eee565b6000808693508592508351915081835110156105b357825191505b600090505b818110156107f65782818151811015156105ce57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110151561064957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9450610840565b82818151811015156106f257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110151561076d57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611156107e95760019450610840565b80806001019150506105b8565b825184511015610828577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9450610840565b82518451111561083b5760019450610840565b600094505b5050505092915050565b6000806108578484610586565b14905092915050565b600061086c838361084a565b905092915050565b600061089961088283610df0565b61088b85610df0565b610e1e90919063ffffffff16565b905092915050565b6000806000835185511415156108ba57600092506109e3565b84519150600090505b818110156109de5783818151811015156108d957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916858281518110151561095457fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156109d157600092506109e3565b80806001019150506108c3565b600192505b505092915050565b60006109f5610eee565b6109fd610eee565b600080869350859250600184511080610a17575060018351105b80610a23575083518351115b15610a50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9450610d0d565b6fffffffffffffffffffffffffffffffff84511115610a91577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9450610d0d565b60009150600090505b8351811015610ce957826000815181101515610ab257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515610b2d57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610cdc57600191505b825182108015610bb757508351828201105b8015610cb857508282815181101515610bcc57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838301815181101515610c4957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610cca578180600101925050610ba5565b8251821415610cdb57809450610d0d565b5b8080600101915050610a9a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b5050505092915050565b6000816040518082805190602001908083835b602083101515610d4f5780518252602082019150602081019050602083039250610d2a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191614905092915050565b610df8610f02565b600060208301905060408051908101604052808451815260200182815250915050919050565b600080610e2b8484610e34565b14905092915050565b60008060008060008060008060008a6000015197508a600001518a600001511015610e6157896000015197505b8a60200151965089602001519550600094505b87851015610ed25786519350855192508284141515610ebb57600185896020030160080260020a03199150818316828516039050600081141515610eba57809850610ee0565b5b602087019650602086019550602085019450610e74565b89600001518b600001510398505b505050505050505092915050565b602060405190810160405280600081525090565b6040805190810160405280600081526020016000815250905600a165627a7a72305820fcb471f7522e763de8c06e6eba885f81d32bc8128e364dc46a35fd7e6c960bb50029

原料气体测量值:

 Gas used for string "x" 1 StringUtilsEqual 23884 SliceEquals 23928 NaiveEquals 23433 Sha3Equals 23708 Gas used for string "foobar123" 9 StringUtilsEqual 28268 SliceEquals 24952 NaiveEquals 26385 Sha3Equals 24732 Gas used for string "foobarxxx124529898453ifdf" 25 StringUtilsEqual 37036 SliceEquals 27000 NaiveEquals 32289 Sha3Equals 26780 Gas used for string "jhkfdfdsfsdgfdsgdsffgfdsgrsehsfrhfrdggewrrtrewgfdsaffvdsfgdsf" 61 StringUtilsEqual 57032 SliceEquals 32006 NaiveEquals 45841 Sha3Equals 31859 Gas used for string "hjfhjdskhjglkhdsjlkghjlkdshjkglhjdsfkhjglfdsjhgjhldsfhgjlkdsfhjkghjfdsklhgjlkfdsjhgfdsgfdshgfds" 95 StringUtilsEqual 75932 SliceEquals 36756 NaiveEquals 58655 Sha3Equals 36682 Gas used for string "hgjkghjdskhgjlserijhlktjiurewihuygtiuserhjkgfhfdsjkvgfhjklfdshjghfdsjghufdshgjlkfdshjlkghfdsjlkghjlkfdshgjlkhfdseulkghfdslkjhgulkijfdshg" 136 StringUtilsEqual 98936 SliceEquals 42801 NaiveEquals 74320 Sha3Equals 42872 


http://earlz.net/view/2017/10/02/1550/economics-of-fees-and-gas

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值