在過去的幾年里,很多人(包括我自己)進(jìn)入了加密貨幣空間,任何與以太坊有過接觸的人都可能會問自己,地球是什么氣體?簡單地說,Gas為以太坊網(wǎng)絡(luò)提供的動力,就像汽油為汽車提供動力一樣。本文將為您揭示這一聲明,以便您在本文結(jié)束時對Gas的真正含義有一個堅(jiān)實(shí)的了解。
以太坊網(wǎng)絡(luò)
Gas為以太坊網(wǎng)絡(luò)提供的動力,就像汽油為汽車提供的動力一樣,這到底意味著什么?為了解釋這一點(diǎn),我需要給你們一些關(guān)于以太坊網(wǎng)絡(luò)主要用途的背景知識。以太坊網(wǎng)絡(luò)是一個計(jì)算機(jī)網(wǎng)絡(luò),它將在區(qū)塊鏈上執(zhí)行代碼并更新其全局狀態(tài)。好吧這聽起來有點(diǎn)復(fù)雜。
這最終意味著,網(wǎng)絡(luò)上的計(jì)算機(jī)正在執(zhí)行代碼和存儲數(shù)據(jù)。這段代碼的執(zhí)行占用了資源(CPU、RAM等),并且因?yàn)榫W(wǎng)絡(luò)上的每臺計(jì)算機(jī)都必須執(zhí)行它。這提供了一種簡單的方法來打破網(wǎng)絡(luò),創(chuàng)建一個具有無限循環(huán)的智能合約,因?yàn)榫W(wǎng)絡(luò)上的每個節(jié)點(diǎn)都試圖執(zhí)行他們會發(fā)現(xiàn)他們自己被卡住的代碼,并且不能為任何其他交易提供服務(wù)。
以太坊的開發(fā)人員和設(shè)計(jì)人員意識到了這一點(diǎn),并理解必須有與代碼執(zhí)行和存儲相關(guān)的成本才能防止這種情況發(fā)生。這種成本被稱為Gas。
智能合約
當(dāng)我提到代碼的執(zhí)行時,我指的是以太坊網(wǎng)絡(luò)上的所有交易,但是在本文中,我想重點(diǎn)討論智能合約。智能合約通常是用像solid這樣的高級編程語言編寫的。這里有一個簡單的智能合約的例子,它把兩個數(shù)字加在一起,并返回結(jié)果。
SOLIDITY
pragma solidity ^0.4.24;contract abc {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
return c;
}
}
這種可靠的代碼編譯成EVM (以太坊虛擬機(jī))字節(jié)碼的方式與java編譯成JVM字節(jié)碼的方式相同。EVM是一種面向安全的虛擬機(jī),旨在允許全球計(jì)算機(jī)網(wǎng)絡(luò)執(zhí)行不可信代碼。
EVM本質(zhì)上是占用您的CPU、RAM等的一部分,并設(shè)置一臺虛擬計(jì)算機(jī)。下面是上面編譯成十六進(jìn)制和字符串字節(jié)碼的可靠度代碼,
HEX BYTECODE
6080604052348015600f57600080fd5b50603580601d6000396000f3006080604052600080fd00a165627a7a72305820a2425c36ccea0b4e81864448087f7f7a36fb11875dfb63711a27fcb427ad1cd00029
STRING BYTECODE
PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x35 DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 LOG2 TIMESTAMP 0x5c CALLDATASIZE 0xcc 0xea SIGNEXTEND 0x4e DUP2 DUP7 DIFFICULTY 0x48 ADDMOD PUSH32 0x7F7A36FB11875DFB63711A27FCB427AD1CD00029000000000000000000000000
注意,十六進(jìn)制和字符串字節(jié)碼在內(nèi)容上完全相同,只是用兩種不同的格式表示。從字符串字節(jié)碼可以看出,有一些簡單的指令,如PUSH1等。EVM的每個opt代碼都有一個相關(guān)的Gas值。例如PUSH1,將一個字節(jié)項(xiàng)放在堆棧上的命令的開銷為3,而計(jì)算KECCAK256等開銷較大的計(jì)算(計(jì)算Keccak-256哈希值的開銷為30 +(6乘以被哈希的單詞數(shù))。
Gas價格,Gas限額和耗盡
你可能參與了ICO,或者你只是簡單地把一些ETH轉(zhuǎn)移到另一個賬戶,在這兩種情況下,你可能被要求提供一個Gas限額和一個Gas價格。一般來說,它們預(yù)先填滿了推薦值,但這兩個值實(shí)際上是什么意思呢?“Gas限額”指的是你將在這筆交易中使用的Gas量,而“Gas價格”指的是你愿意為一種Gas支付的以太幣數(shù)量。你支付的方程很簡單,
Gas PAID = Gas PRICE * Gas USED
CONSTRAINT
Gas USED 《= Gas LIMIT
所使用的Gas是執(zhí)行合約所使用的量,Gas限額對合約執(zhí)行所能使用的最大Gas量起約束作用。這可以阻止惡意代碼或低效代碼耗盡您的以太坊帳戶。
舉個簡單的例子,如果我設(shè)定了100的Gas上限和1ETH的Gas價格,并且我執(zhí)行了一個需要88Gas的合約,那么我將為執(zhí)行該代碼支付88ETH。如果我簽了不同的合約,需要101個Gas,而不是88個,價格和限制條件相同,合約將會在合約結(jié)束前用完。這是因?yàn)槲以O(shè)置了100天然氣的上限,這意味著我愿意支付的最高執(zhí)行這個合約是100Gas。在合約執(zhí)行過程中耗盡Gas將導(dǎo)致它恢復(fù)所做的所有更改。盡管如此,因?yàn)樗匀灰瓿捎?jì)算,你仍然要為你用完的Gas付費(fèi),在這里是100,總成本也就是100。
評論
查看更多