CoinEx链Gas费指南(CLI版)

CoinEx链Gas费指南(CLI版)

名词解释:

  • Gas 为了避免恶意行为,每一笔发送到CoinEx链上的交易都需要指定一定数量的Gas作为燃料⛽️。CoinEx链在执行交易时,会根据实际情况(比如交易字节数、签名类型和数量等等)扣除相应的Gas。提供的Gas数不能小于实际执行时消耗的Gas数。
  • Gas价格 除了Gas,还需要指定Gas的价格。在CoinEx链上,Gas的价格必须是CET。
  • Gas费 Gas乘以Gas价格就得到Gas费💰:GasFee = Gas * GasPrice。Gas费会作为节点激励奖励给出块的验证者(Validator)节点。

预估Gas

那么,我们怎么才能知道一笔交易需要多少Gas呢?答案是通过CoinEx链命令行工具(CLI,更多介绍请看这篇文章)提供的Gas预估功能。以转账为例,send命令(其他交易相关命令也是一样)提供了两个选项来帮助我们预估Gas:

  • --dry-run 如果执行命令时提供了这个选项,那么CLI不会真正的把交易发送到链上,而只是帮助我们估计Gas
  • --gas-adjustment 可以用这个选项调整Gas估计值,这个选项的默认值是1

比如说我们想在测试网testnet2006上发送一笔CET,执行下面的命令就可以帮助我们估计Gas:

$ ./cetcli tx send cettest1tuj25se6w2x0pd9u8f68tktjd333kuqppva7dc 10000000000cet \
   --from bob \
   --node=47.75.208.217:26657 \
   --chain-id=coinexdex-test2006 \
   --dry-run
gas estimate: 23920

可以看到,预估出的Gas是23920。加上--gas-adjustment选项再看看:

$ ./cetcli tx send cettest1tuj25se6w2x0pd9u8f68tktjd333kuqppva7dc 10000000000cet \
   --from bob \
   --node=47.75.208.217:26657 \
   --chain-id=coinexdex-test2006 \
   --dry-run \
   --gas-adjustment=1.5
gas estimate: 35880

预估出的Gas变成了35880(23920 * 1.5 = 35880)。如果我们想保证交易执行成功,或者想让验证者优先打包自己的交易,那么最好是把Gas调的稍微高一点。

指定Gas

有了预估的Gas,就可以通过--gas选项来指定,就像下面这样:

./cetcli tx send cettest1tuj25se6w2x0pd9u8f68tktjd333kuqppva7dc 10000000000cet \
  --from bob \
  --node=47.75.208.217:26657 \
  --chain-id=coinexdex-test2006 \
  --gas=35880

小提示💡:--gas选项的默认值是200000,所以,如果觉得默认值合理,也可以不指定这个选项。

先别着急执行交易,因为我们还没指定Gas费。

指定Gas费

CoinEx链CLI提供了两种方式来指定Gas费:

  • 第一:通过--gas-prices选项指定Gas价格,用Gas乘以Gas价格就可以算出Gas费。
  • 第二:直接通过--fees选项直接指定Gas费。

先来看第一种方式:

$ ./cetcli tx send cettest1tuj25se6w2x0pd9u8f68tktjd333kuqppva7dc 10000000000cet \
  --from bob \
  --node=47.75.208.217:26657 \
  --chain-id=coinexdex-test2006 \
  --gas=35880 \
  --gas-prices=20.0cet
{"chain_id":"coinexdex-test2006","account_number":"46","sequence":"2","fee":{"amount":[{"denom":"cet","amount":"717600"}],"gas":"35880"},"msgs":[{"type":"bankx/MsgSend","value":{"from_address":"cettest1te76rj9p8qrstzyp5mknvekpcsfdr9hjj9mw7j","to_address":"cettest1tuj25se6w2x0pd9u8f68tktjd333kuqppva7dc","amount":[{"denom":"cet","amount":"10000000000"}],"unlock_time":"0"}}],"memo":""}

confirm transaction before signing and broadcasting [y/N]: y
Password to sign with 'bob':
height: 0
txhash: 98062EEABEF44B860B9E10183AF781DDE592836B58501B8F683EED2B2672686C
code: 0
data: ""
rawlog: '[{"msg_index":0,"success":true,"log":"","events":[{"type":"message","attributes":[{"key":"action","value":"send"}]}]}]'
logs:
- msgindex: 0
  success: true
  log: ""
  events:
  - type: message
    attributes:
    - key: action
      value: send
info: ""
gaswanted: 0
gasused: 0
codespace: ""
tx: null
timestamp: ""
events: []

可以看到,交易成功执行了,CLI帮我们算出的Gas费是717600cet(35880 * 20)。这里有几点必须要注意:

  • 通过--gas-prices指定Gas价格时,币种只能是cet,价格必须是小数(即使是整数也要写成20.0这样)
  • 指定的金额实际单位是10^(-8)CET,换句话说,20.0cet实际是0.00000020CET
  • 目前Gas价格不能小于20.0cet

所以执行这边交易花的实际Gas大约是0.072CET。再来看看第二种方式:

$ ./cetcli tx send cettest1tuj25se6w2x0pd9u8f68tktjd333kuqppva7dc 10000000000cet \
   --from bob \
   --node=47.75.208.217:26657 \
   --chain-id=coinexdex-test2006 \
   --gas=35880 \
   --fees=800000cet
{"chain_id":"coinexdex-test2006","account_number":"46","sequence":"3","fee":{"amount":[{"denom":"cet","amount":"800000"}],"gas":"35880"},"msgs":[{"type":"bankx/MsgSend","value":{"from_address":"cettest1te76rj9p8qrstzyp5mknvekpcsfdr9hjj9mw7j","to_address":"cettest1tuj25se6w2x0pd9u8f68tktjd333kuqppva7dc","amount":[{"denom":"cet","amount":"10000000000"}],"unlock_time":"0"}}],"memo":""}

confirm transaction before signing and broadcasting [y/N]: y
Password to sign with 'bob':
height: 0
txhash: E3BCD67DFE2085CD45EB24CC1E56284CE2D6A2E9933E2650A41FC337E1B52176
code: 0
data: ""
rawlog: '[{"msg_index":0,"success":true,"log":"","events":[{"type":"message","attributes":[{"key":"action","value":"send"}]}]}]'
logs:
- msgindex: 0
  success: true
  log: ""
  events:
  - type: message
    attributes:
    - key: action
      value: send
info: ""
gaswanted: 0
gasused: 0
codespace: ""
tx: null
timestamp: ""
events: []

可以看到,交易也执行成功了,Gas费正好是0.08CET。为了让验证者节点优先打包我们的交易,最好还是多给点Gas费😊。有一点需要注意:通过--fees选项指定Gas费时,金额必须是整数。

小提示💡:如果同时指定--gas-prices--fees选项,那么以根据--gas-prices选项计算出的Gas费为准。