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