在《在區(qū)塊鏈上運(yùn)行程序,到底是啥意思?DAPP到底是什么?》里我們談到,BTC腳本語言不具備圖靈完備性,ETH使用的語言,比如Solidity具備圖靈完備性。
具備圖靈完備性的語言,可以使用循環(huán)語句,可以一遍又一遍地執(zhí)行一組指令。這個(gè)特性可能會(huì)造成網(wǎng)絡(luò)堵塞。
ETH如何解決這個(gè)問題?
用Gas。簡單地說,你必須為你的程序執(zhí)行的每一條指令——付費(fèi)。
昨天我們說到,Solidity語言編寫的代碼,會(huì)被編譯為字節(jié)碼。這組字節(jié)碼,就是一組EVM可執(zhí)行的指令。
而執(zhí)行每條指令,都有相關(guān)的Gas成本。參考下表:
這張表中,EVM可以執(zhí)行的每條指令,在Gas Used這一列,都有相應(yīng)的Gas價(jià)格。
這樣,如果你想在ETH網(wǎng)絡(luò)里,跑一百萬次循環(huán)語句堵塞網(wǎng)絡(luò),你需要花費(fèi)的Gas,會(huì)是個(gè)天文數(shù)字哦!你會(huì)放棄的!
你可能會(huì)問,這個(gè)Gas,是我們轉(zhuǎn)賬eth時(shí)設(shè)定的Gas嗎?
每次ETH轉(zhuǎn)賬,Gas,Gas Price,Gas Limit,感覺一臉懵逼,傻傻分不清楚?。?/p>
Gas (燃料)
如前表,Gas的多少,對(duì)應(yīng)于交易中EVM實(shí)際執(zhí)行的運(yùn)算復(fù)雜度。
運(yùn)算越簡單所需Gas就越低。反之,如果轉(zhuǎn)賬過程中,需要用到其它復(fù)雜指令,Gas就會(huì)高。
比如 BALANCE指令,Gas高達(dá)400.
Gas Price(燃料價(jià)格)
是指你愿意為每個(gè)Gas,花費(fèi)多少ETH。Gas Price由交易者設(shè)定。一般用Gwei作單位。
1 Gwei = 0.000000001 Eth。 Gas Price越高,付出的Eth也就越多。
當(dāng)你設(shè)定Gas price = 30 Gwei,表示,愿意為每個(gè)Gas付出:0.00000003 Eth。
Gas 由你主動(dòng)出價(jià)。如果價(jià)格太低,礦工們就會(huì)拒絕幫你打包,幫你轉(zhuǎn)發(fā)交易。
但是如果設(shè)置太高,就會(huì)增加交易成本。
轉(zhuǎn)賬手續(xù)費(fèi)(Tx Fee)
它等于——實(shí)際花費(fèi)燃料(Gas Used)x 單價(jià)(Gas Price)
比如,一次交易運(yùn)算量,需要50Gas,而Gas Price設(shè)為3 Gwei。整個(gè)交易的手續(xù)費(fèi)= 50 * 3 = 150 Gwei = 0.00000015 Eth。
Gas Limit (燃料供給上限)
交易中Gas上限值。是指:交易中最多花費(fèi)多少Gas。
由于交易復(fù)雜度各不相同,ETH網(wǎng)絡(luò)需要完成交易后,才能計(jì)算出一共要花費(fèi)多少Gas。
所以,ETH網(wǎng)絡(luò),要求交易者在發(fā)出交易之前,為交易設(shè)定一個(gè)Gas上限。
如果交易還沒完成,而消耗的Gas,已經(jīng)超過交易者設(shè)定的Gas Limit,那么交易就會(huì)被取消。
轉(zhuǎn)賬的ETH會(huì)退回,但燃料費(fèi)還是要扣除,用作獎(jiǎng)勵(lì)礦工。
而如果交易已經(jīng)完成,而消耗的Gas沒要達(dá)到Gas Limit,則只花費(fèi)實(shí)際消耗的Gas,不會(huì)多算。
強(qiáng)調(diào)
設(shè)置Gas的主要目的,不是為了金錢!
而是為了每條指令都有價(jià)!阻止惡意的循環(huán)語句和其它惡意語句,阻止惡意代碼的運(yùn)行。
責(zé)任編輯;zl
評(píng)論
查看更多