Skip to content

Instantly share code, notes, and snippets.

@changwu-tw changwu-tw/gas.md

Last active Sep 8, 2016
Embed
What would you like to do?

gas

gas:用來衡量交易 (transaction) 或合約 (contract) 在 Ethereum 上被執行的工作量,即多少個指令或多少個動作所需要耗費的單位;由於每一個操作都會消耗某些數量的 gas,越複雜的操作需要消耗較多的計算資源,從而所需的 gas 也越高。

而之所以要設計 gas 這個機制乃是因為一個 smart contract 在給予 input 之後會 run 多久才會停止 或者甚至會不會停止都是無法事先預測的 , 所以要求使用者自己設定願意花多少 gas 在 run 這個 contract 上面 。 (由 afool41 補充)

在 Bitcoin 中,每一筆交易需要手續費,衡量標準是看交易的大小 (transaction size);但站在 Ethereum 的角度則認為,手續費的計算應該取決於在區塊鏈平台上所需要的工作量。

舉例來說,在 Ethereum 當中,兩個合約,程式碼大小不同,有可能短的程式碼,耗費的 gas 高,因為裡面執行的動作很多牽涉到 sha3;但在 Bitcoin 世界,交易包含的資料越多,佔的大小越大,手續費較高。

https://cl.ly/hN0x/Screen%20Shot%202016-09-05%20at%2011.02.54%20PM.png

圖片來源;gas price [檔案]

因此需要的成本可計算如下:

Total cost = gasUsed * gasPrice

gas price

  • gas price 決定 1 個 gas 價值多少 ether,而 gas price 會隨市場需求波動
  • gas price 的單位是 wei ,1 wei = 10^(-18) ether

而 1 ether = 10000 gas,並且 ether 價格是由市場所決定,也因此 gas 的價值會隨 ether 而有所波動 (特別謝謝網友 afool41 糾正)

gas 運作

Q: gas 在交易的生命週期中,怎麼運作? A: 根據 白皮書

  1. 檢查交易是否格式正確(有簽章)
  2. 計算手續費: STARTGAS * GASPRICE
  3. 初始化 GAS = STARTGAS,每 byte 減一個 GAS
  4. 轉移發送方交易價值給收受方。
  5. 如果帳戶是契約帳戶,則執行契約 code 直到完成或沒 GAS
  6. 如果發送方錢不夠或 GAS 燒盡:回復所有其他狀態,但礦工取走所有手續費。
  7. 如果在 GAS 燒盡前執行成功,返還多餘的手續費,燒掉的手續費給礦工。

補充資料

@ChihChengLiang

This comment has been minimized.

Copy link

ChihChengLiang commented Sep 5, 2016

Q: gas 在交易的生命週期中,怎麼運作?
A: 根據 白皮書

  1. 檢查交易是否格式正確(有簽章)
  2. 計算手續費: STARTGAS * GASPRICE
  3. 初始化 GAS = STARTGAS,每 byte 減一個 GAS
  4. 轉移發送方交易價值給收受方。
  5. 如果帳戶是契約帳戶,則執行契約 code 直到完成或沒 GAS
  6. 如果發送方錢不夠或 GAS 燒盡:回復所有其他狀態,但礦工取走所有手續費。
  7. 如果在 GAS 燒盡前執行成功,返還多餘的手續費,燒掉的手續費給礦工。
@ChihChengLiang

This comment has been minimized.

Copy link

ChihChengLiang commented Sep 8, 2016

歷史 gas price 資料 https://etherscan.io/charts/gasprice

@changwu-tw

This comment has been minimized.

Copy link
Owner Author

changwu-tw commented Sep 8, 2016

末段解釋 Gas Prices, Gas Cost, Gas Limit, Gas Fees

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.