1. 程式人生 > >以太坊中的Gas以及其設計原理

以太坊中的Gas以及其設計原理

Gas是一種特別的單位用於Ethereum(以太坊)裡,它用來衡量一個行為或者一系列行為有多少“工作量”。

例如:

計算一個Keccak256加密雜湊值,每次計算雜湊時將需要30個氣體,加上每256位的6個氣體的成本 資料被雜湊 可以通過Ethereum平臺上的交易或合同執行的每個操作都需要一定數量的gas,與需要較少計算資源的操作相比,更多計算資源的操作需要更多的gas成本。

Gas重要的原因是,它確保一個交易支付了適當的費用給乙太網絡。 執行的每個操作(或合同執行)交易都要求支付其相應的費用,這樣才能確保網路不會因為進行大量密集的工作而陷入僵局,這對所有人來說都是無價值的。

這是一個不同於比特幣交易費用的策略,比特幣交易費用僅基於交易的千位元組大小。 由於Ethereum允許執行任意複雜的計算機程式碼,所以很短的程式碼實際上可以導致大量的計算工作正在完成。 因此,直接衡量工作非常重要,而不是僅僅根據交易或合同的長度選擇費用。

那麼如果gas基本上是一筆交易的手續費,你該怎麼支付呢?

這裡有個有點棘手的地方,雖然gas是可以被衡量的單位,但gas沒有任何實際的標記(token)。也就是說,你不能擁有1000個gas,gas只存在於Ethereum虛擬機器的內部,作為執行多少工作的計算數量。關於gas的實際支付場景中,交易手續費以一定數量的ether 作為支付,Ethereum網路中的內建機制(token)中,礦工挖礦生成區塊的獎勵。

初看這個會覺得有點奇怪。 為何不直接在乙太網絡中計算出手續費?

答案是,乙太網絡,如比特幣,擁有快速變化市場價格!但計算成本不會因為乙太網絡幣價的變化而上漲或下降。 所以將計算的價格與以太幣token的價格分開是有幫助的,每次幣價市場走動時,操作的成本都不必改變。

這裡的術語有點混亂。在EVM(乙太網絡虛擬機器)的執行有gas消耗,但gas本身也擁有一個的gas的價格。 每個交易指定了gas價格(每一單位的gas價值多少ether),允許讓市場來決定ether價格與計算操作成本之間的關係(以gas計量)。這是兩者的組合,總gas數量乘以gas單位價格,這就是總交易所需要支付的費用。

像這樣棘手一點,理解這個區別很重要,因為它會讓最初學習者瞭解有關的Ethereum交易感到困惑:

“您的交易中出現的gas與您的交易之間存在差異,沒有足夠高的費用來支援交易(out of gas)”

如果我在交易中設定的gas價格太低,沒有人會接納我的交易作為優先執行。礦工基本不會願意將你的交易打包進區塊裡。如果我提供了一個大家可接受的gas價格,然而我的交易產生如此多的計算工作,gas的成本費用超過了我附加的費用,這個gas是已“花費”了得,沒有辦法收回。礦工將停止處理交易,還原這個交易所做的任何更改,但仍將其作為“交易失敗”包含在塊中,收取費用你支付的費用。

這可能看起來很苛刻,但是當您意識到礦工的真正工作正在執行計算時,您可以看到他們將永遠不會獲得這些資源。所以只有你支付了費用,他們做了他們應做的任務這樣才會是公平的,儘管是你的設計不當,導致沒有支付足夠的gas。

提供太高的費用也不同於提供太多的ether。 如果你設定了非常高的天然氣價格,您所需要只是簡單幾個操作,就為其支付大量的ether,就像在比特幣中設定一個超高的交易費用一樣。 你的任務一定會在最優先考慮佇列前,但是你的錢已經被支付了。

但是,如果您提供正常的gas價格,並且只要附加的ether比您交易消耗的gas所需的更多,那麼乙太網絡將會把超額費用將退還給您。 礦工只收取你們實際工作的費用。您可以將gas價格視為礦工的小時工資,gas成本作為工作時間。

有很多其他的gas的細節,但目前我們還是解釋最基礎的。gas是使Ethereum網路的複雜計算“網路安全”的關鍵機制,因為任何失去控制的程式只會工作持續到最後請求他們的任務執行。 當錢停止支付時,礦工們將會停止工作。

你設計的程式中犯的錯誤,只會影響付費使用它的人。其餘的網路不能因為你的錯誤而遭受效能問題。 當效能問題消耗你的所有ether幣時,他們將簡單地得到一個 big payday! 沒有這個關鍵技術,通用塊鏈的想法是完全不可能的。

簡單而言:gas是計算費用的方式。不過,這些費用仍然是以ether計算,這與gas不同。gas成本是工作量,如勞動時數,而gas價格就像您為完成工作付出的小時工資。 兩者的組合決定了您的總交易費用。如果您的gas價格太低,沒有人會處理您的交易。如果您的gas價格不錯,但交易的gas成本超過預算,交易失敗,但仍然被打包進區塊,勞動者工作了,您不會獲得退款。這樣確保沒有任何東西永遠執行,而且人們會對他們執行的程式碼注意一點。 它使礦工和使用者都能安全避免錯誤的程式碼!

原文來自:https://ethereum.stackexchange.com/questions/3/what-is-meant-by-the-term-gas/62#62