Skip to content

Gas和手續費

用戶需要支付費用才能在 Daodst 網絡上提交交易。 由於以太坊和 Cosmos 的費用處理方式不同,了解 Daodst 區塊鏈如何實現與 Cosmos SDK 兼容的以太坊類型的費用計算非常重要。

因此,本概述解釋了天然氣計算的基礎知識、如何為交易提供費用以及以太坊類型的費用計算如何使用費用市場 (EIP1559) 來確定交易的優先級。

另外請注意,與 Daodst 上的智能合約交互所支付的費用可以為智能合約部署者賺取收入。

先決條件閱讀

基礎

為什麼交易需要手續費?

如果任何人都可以免費向網絡提交交易,則網絡可能會被少數參與者發送大量欺詐性交易以阻塞網絡並使其無法正常工作。

這個問題的解決方案是一個叫做gas的概念,它是在整個交易執行過程中消耗的資源。

在實踐中,代碼執行的每一步都會消耗少量gas,從而有效地對驗證者資源的使用進行收費,並防止惡意行為者隨意中斷網絡。

什麼是 Gas?

一般來說,gas 是衡量特定交易計算強度的單位——換句話說,評估和執行這項工作需要多少工作量。

複雜的多步交易,例如委託給十幾個驗證器的 Cosmos 交易,比簡單的單步交易(例如將代幣發送到另一個地址的 Cosmos 交易)需要更多的 gas。

在提及交易時,gas是指交易所需的gas總量。

例如,一筆交易可能需要 300,000 單位的gas才能執行。

可以將gas視為房屋或工廠內的電力 (kWh),或汽車燃料。

這個想法是要花一些錢才能到達某個地方。

更多 Gas 介紹:

如何計算Gas

一般來說,如果不簡單地運行交易,就無法確切知道交易將花費多少 gas。

使用 Cosmos SDK,這可以通過模擬 Tx 來完成。

否則,有一些方法可以根據交易字段和數據的詳細信息來估計交易將需要的gas。

例如,在 EVM 的情況下,每個字節碼操作都有 相應數量的gas

更多關於Gas計算:

Gas和手續費的關係?

Gas 是指執行所需的計算工作,而費用是指您實際花費來執行交易的代幣數量。

它們是使用以下公式得出的:

Total Fees = Gas * Gas Price (the price per unit of gas)

如果 gas 以 kWh 為單位,則“gas price”將是您的能源供應商確定的費率(以美元/kWh 為單位),而 fees​​ 將是您的賬單。

與電力一樣,gas價格在某一天可能會波動,具體取決於網絡流量。

更多關於 Gas 和 手續費:

Cosmos如何處理手續費?

Cosmos 的gas費相對簡單。作為用戶,您指定兩個字段:

  1. 對應於執行氣體上限的 GasLimit,定義為GasWanted
  2. FeesGasPrice 之一,將用於指定或計算交易費用

節點將完全消耗所提供的費用,然後開始執行交易。 如果在執行過程中發現GasLimit不足,交易將失敗並回滾任何更改,不退還提供的費用。

基於 Cosmos SDK 的鏈的驗證者可以指定他們在選擇要包含在區塊中的交易時將強制執行的“最低汽油價格”。

因此,費用不足的交易將遇到延遲或徹底失敗。

在每個區塊的開始,前一個區塊的費用被分配給驗證者和委託者,之後它們可以被提取和使用。

如何在以太坊上處理手續費?

以太坊的費用包括隨著時間的推移引入的多種實現。

最初,用戶會在交易中指定 GasPriceGasLimit ——很像 Cosmos SDK 交易。

區塊提議者將從區塊中的每筆交易中收取全部汽油費,並且他們會相應地選擇要包含的交易。

隨著提案 EIP-1559 和倫敦硬分叉,gas 計算發生了變化。

上面的 GasPrice 現在被分成兩個獨立的部分:BaseFeePriorityFee

BaseFee 是根據區塊大小自動計算的,一旦區塊被挖出就會被銷毀。

PriorityFee 交給提議者並代表一個小費,或激勵提議者將交易包含在一個區塊中。

Gas Price = Base Fee + Priority Fee

在交易中,除了像以前一樣指定 gas_limit 之外,用戶還可以指定對應於總 GasPricemax_fee_per_gas 和對應於最大 PriorityFeemax_priority_fee_per_gas

所有不需要執行的多餘氣體都退還給用戶。

更多關於 Ethereum 手續費:

實施

如何在Daodst上處理Gas和手續費?

從根本上說,Daodst 是一個 Cosmos SDK 鏈,可作為 Cosmos SDK 模塊的一部分實現 EVM 兼容性。由於這種架構,所有 EVM 交易最終都被編碼為 Cosmos SDK 交易並更新 Cosmos SDK 管理的狀態。由於所有交易都表示為 Cosmos SDK 交易,因此交易費用可以在不同執行層。

實際上,處理費用包括標準的 Cosmos SDK 邏輯、一些以太坊邏輯和 customDaodst 邏輯。大多數情況下,費用由 fee_collector 模塊收取,然後支付給驗證者和委託者。一些關鍵的區別如下:

1.Fee 市場模塊

為了在 Daodst 的 EVM 層上支持 EIP-1559 氣體和費用計算,Daodst 跟踪為每個區塊供應的氣體,並使用它來計算未來 EVM 交易的基本費用,從而實現 EIP 指定的 EVM 動態費用和交易優先級 -1559。

對於 EVM 交易,每個節點都繞過其本地的 min-gas-prices 配置,而是應用 EIP-1559 費用邏輯——gas 價格必須簡單地大於全局 min-gas-price 和區塊的 BaseFee ,剩餘部分被視為優先小費。

這允許驗證者在不應用 Cosmos SDK 費用邏輯的情況下計算以太坊費用。

與以太坊不同,Daodst 上的BaseFee不會被銷毀,而是分發給驗證者和委託者

此外,BaseFee 受全局min-gas-price 的下限(目前,全局min-gas-price 參數設置為零,儘管它可以通過治理進行更新)。

2.EVM Gas返還

Daodst 會為 EVM 交易退還一小部分(默認情況下至少 50%)未使用的氣體,以接近以太坊上的當前行為。

3.收入模塊

Daodst 開發收入模塊作為獎勵開發人員創建有用的 dApp 的一種方式——任何在 Daodst 收入模塊註冊的合同都會從與合同交互的每筆交易中向合同開發人員獎勵一小部分交易費用(目前為 95%). 驗證者和委託者賺取剩餘部分。

詳細時間表

1.節點執行前一個塊並運行 EndBlock 掛鉤 * 作為此掛鉤的一部分,FeeMarket (EIP-1559) 模塊從該塊上的交易中跟踪總的 TransientGasWanted。 這將用於下一個區塊的 BaseFee

2.節點接收後續區塊的交易並將這些交易八卦給同行*這些可以按包含的費用價格排序和優先級(使用 EIP-1559 費用優先機制進行 EVM 交易 ,將包含在下一個區塊中

3.節點為後續塊運行 BeginBlock * FeeMarket 模塊計算 BaseFee 使用前一個塊中的總 GasWanted 應用於此塊。 * 分配模塊 distributes 前一個區塊的費用獎勵給驗證者和委託者

4.對於將包含在此塊中的每個有效交易,節點執行以下操作:

** 他們運行一個對應於交易類型的AnteHandler **。

這個流程:

  1. 執行基本交易驗證
  2. 驗證提供的費用是否大於全球和本地最小驗證器值並且大於計算出的BaseFee 3.(對於以太坊交易)搶占EVM交易消耗gas
  3. 扣除用戶的交易手續費,轉入fee_collector模塊
  4. 增加當前區塊中的 TransientGasWanted,用於計算下一個區塊的 BaseFee

    然後,對於標準Cosmos交易,节点

    • 執行交易並更新狀態
    • 交易消耗gas

    對於以太坊交易,節點:

    • 執行交易並更新狀態
    • 計算使用的gas並與供應的gas進行比較,然後退還指定部分的剩餘部分
    • 如果交易與已註冊的智能合約交互,則將一小部分用作收入的費用作為收入模塊的一部分發送給合同開發商
  5. 節點為此塊運行 EndBlock 並存儲塊的 GasWanted

详细做法

Cosmos Gas

在 Cosmos SDK 中,gas 主要在 GasMeterBlockGasMeter 中進行跟踪:

  • GasMeter:跟踪導致狀態轉換的執行過程中消耗的氣體。 它在每次交易執行時重置。
  • BlockGasMeter:跟踪區塊中消耗的氣體並強制氣體不超過預定義的限制。此限制在 Tendermint 共識參數中定義,可以通過治理參數更改提案進行更改。

由於 gas 是按字節定價的,因此相同的交互在參數值較大的情況下比較小的參數值更耗費氣體(與以太坊的 uint256 值不同,Cosmos SDK 數值使用 Big.Int 類型,它們是動態調整大小的)。

可以在此處 找到有關作為 Cosmos SDK 一部分的 gas 的更多信息。

匹配EVM Gas消耗

Daodst 是一條 EVM 兼容鏈,支持以太坊 Web3 工具。 出於這個原因,氣體消耗必須與其他 EVM 相當,最重要的是以太坊。

EVM 和 Cosmos 狀態轉換之間的主要區別在於,EVM 為每個操作碼使用一個 gas table,而 Cosmos 使用GasConfig為每個 CRUD 操作收取 gas,方法是為訪問數據庫設置固定的每字節成本。

為了匹配EVM消耗的gas,忽略SDK中的gas消耗邏輯,取而代之的是消耗的gas是通過從消息上定義的氣體限制中減去狀態轉換剩餘氣體加上退款來計算的。

為了忽略 SDK 的 gas 消耗,我們將交易GasMeter計數重置為 0,並手動將其設置為 EVM 模塊在執行結束時計算出的gasUsed值。

AnteHandler

Cosmos SDK AnteHandler 在交易執行之前執行基本檢查。

這些檢查通常是簽名驗證、交易字段驗證、交易費用等。

關於 gas 消耗和費用,AnteHandler 檢查用戶是否有足夠的餘額來支付 tx 成本(金額加上費用),並檢查消息中定義的 gas 限制是否大於或等於計算的固有 gas 消息。

Gas 返还

在 EVM 中,gas 可以在執行之前指定。 指定的全部氣體在執行開始時(在AnteHandler步驟期間)被消耗,如果執行後有任何氣體剩餘,剩餘的氣體將退還給用戶。

此外,EVM 還可以定義要返還給用戶的氣體,但這些氣體將被限制為所用氣體的一小部分,具體取決於所使用的分叉/版本。

零手续费交易

在 Cosmos 中,AnteHandler 不強制執行最低 gas 價格,因為min-gas-prices是根據本地節點/驗證器檢查的。

換句話說,接受的最低費用由網絡的驗證者決定,每個驗證者可以為其費用指定不同的最低值。

如果至少有一個驗證者願意在他們提議的區塊中包含0 gas price 的交易,這可能允許最終用戶提交 0 費用交易。

出於同樣的原因,在 Daodst 中,對於evm模塊定義的交易類型以外的交易類型,可以發送0費用的交易。

EVM 模塊交易不能有“0”費用,因為 EVM 本身就需要 gas。

此檢查由 EVM 事務無狀態驗證(即ValidateBasic)函數以及 Daodst 定義的自定義AnteHandler完成。

Gas 预估

以太坊提供了一個 JSON-RPC 端點eth_estimateGas來幫助用戶在他們的交易中設置正確的氣體限制。

因此,在 Daodst 中實現了一個特定的查詢 API EstimateGas。 它將針對當前區塊/狀態應用交易並執行二進制搜索以找到返回給用戶的最佳氣體值(相同的交易將一遍又一遍地應用,直到我們找到失敗前所需的最小氣體) .

我們需要使用二分查找的原因是交易所需的 gas 可能高於應用交易後 EVM 返回的值,因此我們需要嘗試直到找到最優值。

在整個執行過程中將使用緩存上下文以避免更改在狀態中持久化。

對於 Cosmos Tx,開發者可以使用 Cosmos SDK 的交易模擬 來創建準確的預估。

使用Daodst CLI处理Gas和手续费

使用 Daodst CLI 客戶端廣播交易時,用戶應考慮可用的選項。 向網絡發送交易時需要考慮三個標誌:

  • --fees: 隨交易一起支付的費用; 例如:10dst。 默認為所需費用。
  • --gas: 每筆交易設置的氣體限制; 默認值為 200000。
  • --gas-prices: gas 價格來確定交易費用(例如 10dst)。

但是,並非所有這些都需要在每個事務中定義。 正確的組合是:

  • --fees=auto: 自動估算費用和汽油(與 --gas=auto 相同的行為)。 如果使用任何其他與費用相關的標誌(例如,--gas-prices--fees),則會引發錯誤
  • --gas=auto: 與 --fees=auto 相同的行為。 如果使用任何其他與費用相關的標誌(例如,--gas-prices--fees),則會引發錯誤
  • --gas={int}: 使用指定的氣體量和交易所需的費用
  • --fees={int}{denom}: 使用 tx 的指定費用。 對 tx 使用 gas 默認值 (200000)。
  • --fees={int}{denom} --gas={int}: 使用指定的氣體和費用。 使用提供的參數計算 gas-price
  • --gas-prices={int}{denom}: 使用提供的 gas 價格和默認 gas 量 (200000)
  • --gas-prices={int}{denom} --gas={int}: 使用為 tx 指定的氣體,並使用相應的參數計算費用。

讀者應注意,前兩個選項為新用戶提供了更友好的用戶體驗,而後者則適用於更高級的用戶,他們希望對這些參數有更多的控制權。

該團隊引入了自動標誌選項,可以自動計算執行交易所需的汽油和費用。通過這種方式,新用戶或開發人員可以執行交易而無需定義特定的 gas 和費用值。

使用 auto 標誌有時可能無法根據網絡流量估算正確的 gas 和費用。 為了克服這個問題,您可以為 --gas-adjustment 標誌使用更高的值。 默認情況下,它設置為1.2。 當估計值不足時,重試更高的 gas 調整,例如 --gas-adjustment 1.3

不能結合使用 --gas-prices--fees 標誌。 如果是這樣,用戶將收到一條錯誤消息,指出無法同時提供費用和汽油價格。

請記住,如果提供的費用或汽油量不足,上述組合可能會失敗。 如果是這種情況,CLI 將返回一條包含特定原因的錯誤消息。 例如:

raw_log: 'out of gas in location: submit proposal; gasWanted: 200000, gasUsed: 263940.
  Please retry with a gas (--gas flag) amount higher than gasUsed: out of gas'