初识Ton的gas费


前言:gas是谁决定的

木森:艾丽卡,今天我们要讨论的是在TON网络上的交易费用问题。你知道,所有的计算成本都是用Gas单位来计算的,而且这个费用是固定的。

艾丽卡:对呀,木森。我还听说,Gas的价格是由链的配置决定的,而且只能通过验证者的共识来改变呢。这是不是意味着,我们用户不能自己设定Gas价格,也没有一个自由的市场来决定价格?

木森:没错,艾丽卡。在TON网络的basechain中,1单位的Gas成本是400纳吨,而在masterchain中,1单位的Gas成本是10000纳吨。这意味着,即使是在TON价格增加100倍的情况下,交易费用仍然会非常便宜,不到0.01美元。

艾丽卡:哇,那听起来我们不用担心交易费用会变得太高了。但是,如果Gas价格有一天真的上升了1000倍或者更多,那会发生什么呢?

木森:技术上讲,这是可能的,但实际上,这种情况不太可能发生。因为验证者通过处理交易获得的手续费用,如果收取更高的费用,会导致交易数量减少,这将使得验证过程的收益降低。

艾丽卡:我明白了,木森。那么,如果我们想要改变Gas的费用,需要通过什么样的过程呢?

木森:改变Gas费用,就像TON网络中的许多其他参数一样,是可以通过特殊投票来进行的。改变任何参数都需要获得66%的验证者投票。

一、gas费的基本计算公式

木森:安哆啦,我对TON的费用结构好好奇,但是却不知道该怎么计算!

安哆啦:嗯哼,木森,这个东西确实复杂,但是它都是很有逻辑和必要的!首先,你要记住,手续费就像是魔法能量,它是由好多小星星✨组成的。这是官方的魔法公式:

transaction_fee = storage_fees + in_fwd_fees + computation_fees + action_fees + out_fwd_fees

木森:哇,听起来像是我们要去拯救TON星球的能源呢!安哆啦,你能给我详细解释一下这些小星星吗?

安哆啦:当然可以,木森!storage_fees 就像是我们智能合约的小家在TON星球上占用的空间费。你的TON钱包也是一个小小的家,每次你用它来接收或者发送礼物🎁时,都要支付一点点租金哦。

木森:那in_fwd_fees 是什么呢?是不是像邮差叔叔🏣把信件送到我们家门口的费用?

安哆啦:没错,木森!in_fwd_fees 就是那些从TON星球外面飞进来的消息需要的费用。这些消息要飞到处理它们的验证者家里,就像是邮差叔叔把信送到收信人手上一样。

木森:我懂了,那computation_feesaction_fees 是什么呀?

安哆啦:computation_fees 是我们智能合约在TON星球的虚拟机里玩耍的费用。每次你用钱包发送交易,就像是在玩一个游戏,游戏机需要能量来运行,这个能量就是computation_fees

action_fees 呢,就是当我们的游戏结束后,要处理所有发生的小冒险和行动的费用。就像是游戏结束后,我们要清理游戏场地,准备下一次的游戏。

木森:那out_fwd_fees 是什么呢?这个听起来好像我们要把礼物🎁送到TON星球外面去呢!

安哆啦:是的,木森!out_fwd_fees 是我们把消息送到TON星球外面的费用,比如给其他星球的小伙伴或者链下的朋友们发送消息。这个费用是给那些帮助我们发送消息的验证者的,就像是给邮差叔叔的小费。

木森:原来如此,安哆啦。那手续费是怎么计算的呢?我看到有篇文章说,手续费很难提前计算,因为它们会随着好多我们看不见的小星星变化。

安哆啦:没错,木森。这就是为什么有时候我们可能会多准备一些TON,就像是我们去市场购物时,妈妈会给我们一些额外的零花钱,以防万一我们需要买更多的东西。🌟💖

1.储存费用

艾丽卡看到官方文档有这样的一句话:Only unique hash cells are counted for storage and fwd fees i.e. 3 identical hash cells are counted as one." 这句话的意思是,在计算存储和转发费用时,只有唯一的哈希单元被计算在内,也就是说,3个相同的哈希单元在计数时会被视为一个。

安哆啦姐姐,这是什么意思呀!

安哆啦:艾丽卡,你提出的问题是关于TON网络的独特存储费用计算方式,特别是“只有唯一的哈希单元格才算费用”这一点,对吧?

艾丽卡:是的,安哆啦!我就是想知道,为什么我们只有当哈希单元格是唯一的时候才计算存储费用呢?真的吗?

安哆啦:好的,让我来解释一下。在TON网络中,为了优化资源的使用和减少不必要的费用,系统只会对那些唯一的哈希单元格进行计数和收费。这意味着,即使你的智能合约中有多个相同内容的单元格,它们在计算存储费用时只会被计算一次。这样的设计可以避免因为重复数据而产生的额外费用。还有就是,你的TON钱包,即使是非常小的钱包,也占用了区块链上的一些空间,所以也需要支付一定的存储费用。这就像是无论你的魔法背包有多大,只要它放在我们的魔法仓库里,我们就需要为占用的空间支付一点点费用。

艾丽卡:哦,我明白了。但是,如果我们很长时间没有使用TON钱包,费用会变大吗?

安哆啦:是的,如果你的TON钱包在一年内都没有使用,那么由于钱包在发送和接收交易时都需要支付手续费,你将需要支付比平时更多的费用。这是因为钱包会为存储在区块链上的数据支付费用,即使是不活跃的钱包,只要它还存储在区块链上,就会持续产生存储费用。

艾丽卡:原来是这样,谢谢安哆啦姐姐!那我们到底怎么精确计算存储费用呢?

安哆啦:我们可以使用这个公式来大致计算智能合约的存储费用:

storage_fee = (cells_count * cell_price + bits_count * bit_price) * time_delta / 2^16

这里的cells_count是你智能合约使用的单元格数量,bits_count是你智能合约使用的比特数量,cell_pricebit_price分别是每个单元格和每个比特的价格,这些价格可以从网络配置参数中获取。目前,工作链的bit_price_ps是1,cell_price_ps是500,而主链的mc_bit_price_ps是1000,mc_cell_price_ps是500000。

艾丽卡:安哆啦,你真是太聪明了!现在我完全明白了。谢谢!

木森:安哆啦,我刚刚听说在TON网络中,如果我们有很多重复的单元格,我们是不是可以节省很多存储费用?

安哆啦:嗯,木森,这里有一个常见的误解。虽然TON网络在计算存储费用时,确实只会对唯一的哈希单元格(unique hash cells)进行计数,这意味着即使有多个相同内容的单元格,它们只会被计算一次。但是,bits_count,也就是单元格中比特的数量,是会因为数据总量的增加而累加的。所以,即使你的多个单元格内容相同,你仍然需要为它们所占用的总比特数支付费用。

艾丽卡:但是,安哆啦,如果一个单元格里的数据是多余的,它们不是说不会被计算进存储费用吗?

安哆啦:艾丽卡,即使是多余的数据,只要它存储在区块链上,就会占用一定的比特数,因此也会计入bits_count。

哈哈哈哈,孩子们,这时候星球爷爷从门外走来。

星球爷爷:孩子们,你们的讨论非常精彩。但其实Ton的开发者是不会允许两个相同hash数据同时出现的,这就是Cell的神奇之处,所以,其根本不用纠结计费的问题。在TON网络中,存在着一种独特的去重机制,TON网络在序列化Cell之前,会通过比较它们的哈希值来识别和去重相同的Cell。所以具有相同内容的Cell时,这些Cell在存储费用的计算中只会被计算一次。

安哆啦:哇,星球爷爷,这真是太神奇了!是我一开始理解错了,这样的话,我们就不用担心多余的数据会增加我们的存储费用了。

星球爷爷欣慰的笑了,带大家来到Param 18

在TON区块链中,参数18(Param 18)是用于确定数据存储价格的配置参数,这有助于防止垃圾信息的传播,并鼓励维护网络。存储费用参数的字典包括:- utime_since:这个参数提供了指定价格适用的初始Unix时间戳。bit_price_pscell_price_ps:这些参数代表TON区块链主工作链中存储1比特或1单元格信息的价格,计费周期为65536秒。mc_bit_price_psmc_cell_price_ps:这些参数代表TON主链中计算资源的价格,同样计费周期为65536秒。
这些价格参数确保了智能合约的存储成本与其占用的空间和时间成正比。例如,如果你的智能合约在主工作链上,那么它的存储费用将基于bit_price_pscell_price_ps来计算。如果你的智能合约在主链上,那么将使用mc_bit_price_psmc_cell_price_ps

代码实验

在TON区块链中,存储费用的计算考虑了智能合约所使用的单元格(cells)和比特(bits)的数量。如果存在重复的单元格,TON网络会在计算存储费用之前进行去重,以确保每个唯一的单元格只被计算一次。以下是一个模拟的的计算示例,展示了如何计算考虑去重后的存储费用。

假设我们有一个智能合约,它使用了以下单元格:

  • 一个24比特的单元格(A)
  • 一个7比特的单元格(B)
  • 一个与单元格A内容相同的24比特单元格(C),它是多余的,因为内容与单元格A重复

在这种情况下,尽管单元格C与单元格A内容相同,但由于TON网络的去重机制,它在计算存储费用时不会被重复计算。因此,我们只需要为两个唯一的单元格(A和B)支付存储费用。

现在,我们使用以下公式计算存储费用:

storage_fee = (cells_count * cell_price + bits_count * bit_price) * time_delta / 2^16

给定的参数为:

  • cells_count = 2(因为单元格C被去重了)
  • bits_count = 24(单元格A)+ 7(单元格B)= 31比特
  • cell_price = 500(工作链的单元格价格)
  • bit_price = 1(工作链的比特价格)
  • time_delta = 365天(我们以秒为单位计算时间间隔)

首先,我们将时间间隔转换为秒:

duration = 60 * 60 * 24 * 365 // 1 Year in seconds

然后,我们计算每秒的价格:

pricePerSec = (cells_count * cell_price + bits_count * bit_price)

接下来,我们计算总的存储费用:

fee = (pricePerSec * duration) / 2^16

最后,我们将费用转换为TON(假设1 TON = 10^9 nanoTONs):

storage_fee_in_TON = fee * 10**-9

将上述计算放入代码中,我们得到:

function storageFeeCalculator() {
  const cells_count = 2; // 两个唯一的单元格
  const bits_count = 31; // 单元格A和B的比特总数
  const duration = 60 * 60 * 24 * 365; // 1年的秒数

  const bit_price_ps = 1;
  const cell_price_ps = 500;

  const pricePerSec = (cells_count * cell_price_ps + bits_count * bit_price_ps);
  let fee = Math.ceil(pricePerSec * duration / 2**16) * 10**-9;
  let days = Math.floor(duration / (3600 * 24));
  
  let str = `Storage Fee: ${fee} TON (for ${days} days)`;
  
  return str;
}

// 调用函数并输出结果
console.log(storageFeeCalculator());

执行上述代码,我们将得到考虑去重后的存储费用。这个例子展示了TON网络如何通过去重机制优化存储费用的计算,确保用户只为实际使用的资源付费。

PS:计算出来的小伙伴小伙伴,评论区留言前3名有奖哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值