本文精通以太坊系列第二篇,前一篇《精通以太坊之nonce值,真的能避免51%攻擊嗎?》
Gas,是用來驅(qū)動以太坊平臺轉(zhuǎn)動的燃料,其實(shí)就是手續(xù)費(fèi)。
轉(zhuǎn)帳需要手續(xù)費(fèi),部署合約,調(diào)用合約都需要手續(xù)費(fèi)。
為什么需要Gas
1. Gas的存在,防止了大量垃圾交易的存在,垃圾交易會堵塞了網(wǎng)絡(luò)正常運(yùn)行,以及造成污染區(qū)塊鏈上數(shù)據(jù)。(發(fā)送垃圾交易有成本)
2. 通過設(shè)置一個(gè)Gas limit 的數(shù)量,可以限定每個(gè)區(qū)塊的交易數(shù)量,以控制區(qū)塊大小。
3. 礦工需要收入,不能單靠挖礦增發(fā)的部分。
手續(xù)費(fèi) = Gas * Gas price?
手續(xù)費(fèi)由兩個(gè)值來體現(xiàn): Gas limit 和?Gas price
Gas limit:每筆交易會消耗多少個(gè)Gas?這個(gè)是系統(tǒng)的一系列規(guī)則計(jì)算出的,用戶無法決定,但是用戶可以為每筆交易設(shè)置一個(gè)上限,但如果設(shè)置的太低導(dǎo)致交易沒執(zhí)行完,那交易不成功,但Gas?已全部消耗且不退還。
舉例說明:你部署智能合約而發(fā)起了一筆交易,Gas limit?設(shè)置為200萬,而實(shí)際執(zhí)行時(shí)只消耗了150萬,最后會返回50萬Gas。
Gas price:?是交易發(fā)送方,愿意為每個(gè)gas?支付的單價(jià)。(這個(gè)是用戶自己決定的,Gas price越高,交易越優(yōu)先執(zhí)行,Gas price太低了,執(zhí)行很慢,甚至被拒絕執(zhí)行)
手續(xù)費(fèi) =?實(shí)際最終消耗Gas * Gas price (兩者兩乘就是真正支付的手續(xù)費(fèi)。)
?Gas?消耗
上面說了,用戶發(fā)送一筆交易,可以設(shè)置一個(gè)Gas limit,代表最多消耗這些,但最終以系統(tǒng)實(shí)際消耗的結(jié)果為準(zhǔn)。
Gas?支出 分為四大塊:
1、交易的網(wǎng)絡(luò)傳輸費(fèi)用,?這也是基本費(fèi)用,普通交易21000個(gè)gas,合約交易54000個(gè),還要加上data字段里的字節(jié)長度來算,普通轉(zhuǎn)帳交易的data字段可以理解為附言。
普通交易只有一個(gè)基本費(fèi)用,但如果是智能合約的創(chuàng)建,或合約執(zhí)行,則還包括以下。
2、EVM執(zhí)行合約的費(fèi)用,EVM是以太坊虛擬機(jī),它每執(zhí)行一個(gè)指令都設(shè)定了消耗的gas數(shù)量,大家都一樣。
這么理解吧:部署合約或調(diào)用合約,都會被EVM翻譯為一系列的步驟,每執(zhí)行一步扣多少數(shù)量的gas是固定的。
3、存儲費(fèi)用。如果是在區(qū)塊鏈上創(chuàng)建一個(gè)新的合約,合約的代碼會被存入數(shù)據(jù)庫中,這會根據(jù)合約的字節(jié)長度來計(jì)算,也就是代碼寫得太長了,需要的gas就很多。所以合約不要太多廢話。
4、特殊的費(fèi)用返還。如果你的合約去刪除一些已無用的變量,合約代碼,那會?有g(shù)as的返還,但是返還數(shù)量不會超過本次交易的一半。
實(shí)際費(fèi)用= 1+2+3-4
因此,你設(shè)置的Gas limit?要覆蓋上面的情況,一個(gè)普通交易不添加額外信息就是21000,而合約部署是最消耗gas的,涉及合約代碼的傳輸及存儲,一個(gè)簡單發(fā)幣合約在1百萬左右,有的復(fù)雜合約高達(dá)幾百萬。
目前?一個(gè)區(qū)塊的最大Gas?是800萬,一筆交易不可能超過這個(gè)值,太長太長的合約超過這個(gè)數(shù)就不會執(zhí)行成功了。
更多區(qū)塊鏈帖子,請關(guān)注本人公眾號:財(cái)神下山。