Transactions

“氣體”一詞是什麼意思?

  • January 22, 2022

我想使用的乙太坊應用程序談到需要“gas”才能執行。什麼是氣體,我從哪裡得到它?

“Gas”是乙太坊中使用的特殊單位的名稱。 它衡量一個動作或一組動作需要執行多少“工作”:例如,要計算一個Keccak256加密散列,每次計算一個散列需要30 個 gas,再加上每 256 位的多 6 個 gas 成本被散列的數據。 乙太坊平台上的交易或合約可以執行的每項操作都需要消耗一定數量的gas,需要更多計算資源的操作比需要少量計算資源的操作花費更多的gas。

天然氣之所以重要,是因為它有助於確保送出給網路的交易支付適當的費用。通過要求交易為其執行的每項操作(或導致合約執行)付費,我們確保網路不會因執行大量對任何人都沒有價值的密集工作而陷入困境。這是與比特幣交易費不同的策略,比特幣交易費僅基於交易的千字節大小。由於乙太坊允許執行任意複雜的電腦程式碼,因此較短的程式碼長度實際上會導致大量計算工作的完成。因此**,重要的是直接衡量完成的工作,而不是僅僅根據交易或契約的長度來選擇費用**。

那麼如果gas基本上是一種交易費用,你如何支付呢?這是它變得有點棘手的地方。 儘管 gas 是可以衡量事物的單位,但 gas 並沒有任何實際的代幣。也就是說,你不能擁有 1000 個氣體。 相反,gas 僅存在於乙太坊虛擬機內部,作為正在執行的工作量的計數。 在實際支付gas 時,交易費是按一定數量的ether收取的,這是乙太坊網路上的內置代幣以及礦工因生產區塊而獲得獎勵的代幣。

起初這可能看起來很奇怪。 為什麼運營不直接用乙太幣來衡量成本? 答案是乙太幣和比特幣一樣,有一個可以迅速變化的市場價格!但是計算成本不會因為乙太幣價格的變化而上升或下降。因此**,將計算的價格與乙太幣的價格分開是很有幫助的**,這樣就不必在每次市場變動時都改變操作成本。

這裡的術語有點混亂。EVM 中的操作有 gas成本,但 gas 本身也有一個以 ether 為單位的 gas**價格。**每筆交易都指定了它願意為每單位天然氣支付的乙太幣價格,允許市場決定乙太幣價格與計算操作成本(以天然氣為單位)之間的關係。 這是兩者的組合,使用的總氣體乘以支付的氣體價格,得出交易支付的總費用

儘管很棘手,但理解這種區別很重要,因為它會導致最初的學習者對乙太坊交易最困惑的事情之一: 你的交易用盡 gas 和你的交易沒有足夠高的燃料是有區別的費用。如果我在交易中設置的gas 價格太低,那麼一開始就沒有人會費心去執行我的交易。礦工根本不會將其包含在區塊鏈中。但是,如果我提供了一個可接受的 gas價格,然後我的交易導致瞭如此多的計算工作,以至於總的gas 成本超過了我作為費用附加的金額,那麼該 gas 算作“花費”而且我沒有得到它。礦工將停止處理交易,恢復其所做的任何更改,但仍將其作為“失敗的交易”包含在區塊鏈中,並為其收取費用。這可能看起來很苛刻,但是當您意識到礦工的真正工作是執行計算時,您會發現他們也永遠不會收回這些資源。因此,即使您設計糟糕的交易耗盡了燃料,您也應該為他們所做的工作付費。

提供過多的費用也不同於提供過多的乙太幣。 如果你設置了非常高的 gas 價格,你最終會為一些操作支付大量的乙太幣,就像在比特幣中設置超高的交易費用一樣。你肯定會被優先排在隊伍的最前面,但你的錢沒了。但是,如果您提供了正常的 gas 價格,並且只是附加了比您的交易消耗的 gas 所需的更多的乙太幣,那麼超出的金額將退還給您。礦工只向你收取他們實際工作的費用。 您可以將 gas 價格視為礦工的小時工資,將 gas 成本視為他們的工作時間表

氣體還有很多其他的微妙之處,但這應該會給你一些基礎知識! Gas 是使乙太坊中的複雜計算對網路執行“安全”的關鍵機制,因為任何失控的程序只會持續多久,只要請求他們執行的人提供的資金。當資金停止時,礦工停止工作。你在程序中犯的錯誤只會影響付費使用它的人——網路的其餘部分不會因為你的錯誤而遭受性能問題。當性能問題耗盡你的所有乙太幣時,他們只會獲得豐厚的回報!如果沒有這種關鍵技術,通用區塊鏈的想法將是完全不可能的。

tl;博士:

  • Gas是費用的計算方式
  • 不過,費用仍然以乙太幣支付,這與天然氣不同
  • 汽油成本是投入某物的工作量,例如勞動小時數,而汽油價格就像您為完成的工作支付的小時工資。兩者的結合決定了您的總交易費用。
  • 如果你的gas價格太低,沒有人會處理你的交易
  • 如果你的 gas價格很好,但你的交易的 gas成本“超出預算”,那麼交易就會失敗,但仍會進入區塊鏈,並且你不會為工人所做的工作拿回錢。
  • 這可以確保沒有任何東西永遠執行,並且人們會小心他們執行的程式碼。它使礦工和使用者免受不良程式碼的侵害!

引用自:https://ethereum.stackexchange.com/questions/3