# 资源模型

# 概述

TOP Network链上的交易可被分为分片交易、Beacon系统交易、Beacon系统交易,每笔交易都会消耗链上资源。

像NET、CPU这种临时占用的资源,我们称为gas。

每个账户:包括智能合约账户和普通账户,都有免费的gas资源配额。

为了获得更高的配额,账户必须锁定TOP Token以兑换gas资源。

# gas 消耗规则

gas消费规则根据交易涉及的交易类型以及账户类型而不同。

  • 非调用合约的交易,仅向发起方收费。

  • 普通账户调用用户合约交易,优先向发起方收费,发起方与合约共同承担(用户合约可设置愿意为交易支付的gas费上限)。

  • 普通用户调用系统合约向发起方收费,系统内部触发的系统合约调用不收取费用。

交易消耗的gas如下表所示。

交易类型 总消耗gas 交易费发送方支付 交易接收方支付 备注
单账户交易 tx_len*1 tx_len*1 - -
跨账户交易 非调用合约交易 tx_len*3 tx_len*3 0 -
调用系统合约交易 tx_len*3 tx_len*3 0 -
调用用户合约交易 tx_len*3+CPU ns(合约指令集)/40 费用的一半由发送方承担,另一半优先由用户合约承担,合约无法支付再由发送方承担 min(gasLimit,合约余额,receiver action消耗的gas/2) gasLimit:合约愿意为交易发送方付出的每笔交易的gas费用上限。

对于Beacon系统合约交易来说,除了会消耗gas,交易发送放还将会被自动扣除一笔手续费并被销毁,当前为100*10^6 uTOP token。这一小笔费以保护Beacon系统免受泛滥交易攻击。

当前需要扣除Beacon交易手续费的交易包括:

注册矿工、启动节点、更新矿工信息、增加矿工保证金、减少矿工保证金、修改矿工昵称、设置分红比例、更新矿工类型、赎回矿工保证金、注销矿工、发起提案、撤回提案、表决提案。

# 交易费计算

交易费用的计算公式如下:

交易费用 = tx_fee + send_block_info 中的 used_depost + confirm_block_info 中的 used_deposit

对于转账交易,tx_fee = 0,confirm_block_info 中的 used_deposit = 0,所以 交易费用 = send_block_info 中的 used_depost

代码示例如下,您可通过 getTransaction 接口查看各字段的含义。

{
 "data" : {
    "original_tx_info" : {
       "amount" : 1000000,
       "authorization" : "0x01c00cf3c8ca7c883b7ab130ac56ccb53c2c066640659d9babe21655a6b3a073455a3b8d06ee5b1a955b756a7800f0230afc7299a97f3ca9c57555d7890518472b",
       "edge_nodeid" : "",
       "ext" : "",
       "last_tx_nonce" : 4,
       "note" : "",
       "premium_price" : 0,
       "receiver_account" : "T8000042537218707b66d49fc06143b60d029cfe2b65f4",
       "receiver_action_name" : "",
       "receiver_action_param" : "0x03000000544f5040420f0000000000",
       "send_timestamp" : 1645012819,
       "sender_account" : "T800008c5a874df3f8b6d1e357890f881704bf8849feeb",
       "sender_action_name" : "",
       "sender_action_param" : "0x03000000544f5040420f0000000000",
       "token_name" : "",
       "tx_deposit" : 100000,
       "tx_expire_duration" : 100,
       "tx_hash" : "0xb014bcfa3bb14f350531c95f0a5c32f32aaabb5aaaebe9cc214aab3776f483fe",
       "tx_len" : 137,
       "tx_structure_version" : 2,
       "tx_type" : 4
    },
    "tx_consensus_state" : {
       "confirm_block_info" : {
          "account" : "Ta0000@31",
          "exec_status" : "success",
          "height" : 28,
          "recv_tx_exec_status" : "success",
          "used_deposit" : 0,
          "used_gas" : 0
       },
       "recv_block_info" : {
          "account" : "Ta0000@27",
          "height" : 17,
          "used_gas" : 0
       },
       "send_block_info" : {
          "account" : "Ta0000@31",
          "height" : 25,
          "tx_fee" : 0,
          "used_deposit" : 0,
          "used_gas" : 411
       }
    },
    "tx_state" : "success"
 },
 "errmsg" : "OK",
 "errno" : 0,
 "sequence_id" : "1"
}

# 每日免费 gas

默认情况下,若账户余额大于等于100 TOP token,该账户每24小时还会被免费赠送25,000Tgas。这允许该账户每日可以进行多次免费交易。

最低限额可避免作恶者使用免费分配的gas来创建大量账户和泛滥交易实施攻击。

账户已使用gas随时间逐步衰减,24小时(链上治理参数)后衰减到0,即可用gas恢复到gas额度,衰减的公式如下:

decay_formula

比如在时间T1时刻,账户gas已使用量为U,到T1+12h,账户再次使用gas为u,此时账户已使用TGAS为 U/2 + u。

# 锁定 TOP token 兑换 gas

普通账户和合约账户都可以锁定TOP token以兑换更多的gas(合约账户无法主动发起,可由部署合约的父账户发起)。

兑换gas的公式如下:

acquire_gas

其中:系统总gas=单片gas*分片数(validator_group_count)。单片gas和分片数可以通过链上治理调整。分片数目前被设置为4,系统gas总量随着分片数的增长而增长。

锁定在系统中的TOP token总数每十分钟更新一次,其值存储在一个系统合约中。

系统总锁定TOP=初始值+用户锁定值,以免初始gasprice为0。

一个普通账户24小时内可以获得的gas不超过200,000Tgas,大约可以发起800条交易。

一个合约账户24小时内可以获得的gas不超过10,000,000Tgas,大约可以执行4万条交易,使用4秒CPU。

# gas 消耗与 NET/CPU 的关系

1Tgas相当于1byte的带宽或40ns的CPU时间。

字节是根据原始交易的大小计算的。

CPU时间仅在执行合约时消耗,并且总CPU时间是根据合约指令集确定的。

一个交易最多允许消耗25,000Tgas。

# 交易保证金(tx_deposit)

大多数用户将有足够的免费gas来满足他们的日常需求,而那些发送较多交易的用户可能会用光gas,并需要支付一笔数额很小的交易保证金。

当账户没有足够的gas来发送交易时,TOP Network将从其交易保证金(tx_deposit)余额中扣除一部分费用兑换gas以支付交易费用。

交易保证金余额必须大于或等于0.1 TOP token来抵消gas花费,这笔费用随即被销毁。

每笔交易保证金从账户除转账金额以外的账户余额中冻结。

当前交易保证金兑换gas比例设置为:1Tgas=100 uTOP token。

交易保证金可以通过链上治理进行更改。