1.Gas費用
以太坊的一個非常重要的概念是費用(fees)篱昔。每一次在以太坊網(wǎng)絡(luò)上進行的交易都會產(chǎn)生費用钉鸯,這筆費用是以“Gas”名義支付的。
gas就是用來衡量在一個具體計算中要求的費用單位。gas price就是你愿意在每個gas上花費Ether的數(shù)量,以“gwei”進行衡量和泌。“Wei”是Ether的最小單位祠肥,1Ether表示10^18Wei. 1gwei是1,000,000,000 Wei武氓。
對每個交易,發(fā)送者設(shè)置gas limit和gas price仇箱。gas limit和gas price就代表著發(fā)送者愿意為執(zhí)行交易支付的Wei的最大值县恕。
例如,假設(shè)發(fā)送者設(shè)置gas limit為50,000工碾,gas price為20gwei。這就表示發(fā)送者愿意最多支付50,000*20gwei = 1,000,000,000,000,000 Wei = 0.001 Ether來執(zhí)行此交易百姓。
記住gas limit代表用戶愿意花費在gas上的錢的最大值渊额。如果在他們的賬戶余額中有足夠的Ether來支付這個最大值費用,那么就沒問題。在交易結(jié)束時任何未使用的gas都會被返回給發(fā)送者旬迹,以原始費率兌換火惊。
如果發(fā)送者沒有提供必要的Gas來執(zhí)行交易,則交易“gas不足”并被認為是無效的奔垦。在這種情況下屹耐,交易處理中止,發(fā)生的任何狀態(tài)變化都被顛倒過來椿猎,以致在交易之前我們最終回到以太坊的狀態(tài)惶岭。另外,交易失敗的記錄犯眠,顯示交易是什么嘗試以及失敗的地方按灶。而且,由于機器已經(jīng)耗盡了在用完gas之前進行計算的努力筐咧,在邏輯上鸯旁,沒有g(shù)as被退還給發(fā)送者。
這些gas究竟在哪里量蕊?發(fā)送者花費在gas上的所有資金都被發(fā)送到“受益人”地址铺罢,這通常是礦工的地址。由于礦工正在花費精力進行計算和確認交易残炮,所以礦工收到gas作為獎勵韭赘。
通常,發(fā)送者愿意支付的氣價越高吉殃,礦工從交易中獲得的價值就越高辞居。因此,礦工越可能選擇它蛋勺。通過這種方式瓦灶,礦工可以自由選擇要驗證或忽略的交易。為了引導(dǎo)發(fā)送者設(shè)置gas price抱完,礦工可以選擇廣告他們將執(zhí)行交易的最低gas價格贼陶。
1.1 存儲也有費用
Gas不僅用于支付計算步驟,還用于支付存儲的費用巧娱。存儲的總費用與使用的32字節(jié)的最小倍數(shù)成正比碉怔。
存儲費有一些細微的方面。例如禁添,由于增加的存儲量會增加所有節(jié)點上的以太坊狀態(tài)數(shù)據(jù)庫的大小撮胧,因此存在一個激勵機制,可以保持較小的數(shù)據(jù)存儲量老翘。因此芹啥,如果一個交易的執(zhí)行有一步是清除一個存儲實體锻离,那么為執(zhí)行這個操作的費用就會被放棄,并且由于釋放存儲空間的退款就會被返回給發(fā)送者墓怀。
1.2 收費的目的是什么汽纠?
以太坊工作方式的一個重要方面是網(wǎng)絡(luò)執(zhí)行的每一個操作都同時受到每個全節(jié)點的影響。但是傀履,以太坊虛擬機上的計算步驟非常昂貴虱朵。因此,以太坊智能合約最適合用于簡單的任務(wù)钓账,如運行簡單的業(yè)務(wù)邏輯或驗證簽名和其他加密對象碴犬,而不是像文件存儲,電子郵件或機器學(xué)習(xí)這樣可能給網(wǎng)絡(luò)帶來壓力的更復(fù)雜用途官扣。征收費用可以防止用戶使網(wǎng)絡(luò)負擔過重翅敌。
以太坊是一個圖靈完備語言。(簡而言之惕蹄,圖靈機是一種可以模擬任何計算機算法的機器蚯涮,這樣就可以實現(xiàn)循環(huán),并使得以太坊容易陷入停滯問題卖陵,無法確定程序是否無限運行遭顶,如果沒有收費,惡意行為人可以通過在交易內(nèi)部執(zhí)行無限循環(huán)而輕易地破壞網(wǎng)絡(luò)泪蔫,沒有任何影響棒旗,因此費用保護網(wǎng)絡(luò)免受故意的攻擊。
你可能會想撩荣,“為什么我們還要為存儲付費铣揉?”好吧,就像計算一樣餐曹,以太坊網(wǎng)絡(luò)上的存儲成本是整個網(wǎng)絡(luò)必須承擔的成本逛拱。
2.交易和消息
我們之前指出,以太坊是一個基于交易的狀態(tài)機台猴。換句話說朽合,不同賬戶之間發(fā)生的交易是把以太坊的全球狀態(tài)從一個國家轉(zhuǎn)移到另一個國家的原因。
從最基本的意義上說饱狂,交易是由外部擁有的賬戶產(chǎn)生的經(jīng)過加密簽名的一條指令曹步,序列化,然后提交給區(qū)塊鏈休讳。
有兩種類型的交易:消息呼叫和合約創(chuàng)造(即創(chuàng)造新的以太坊合約的交易)讲婚。?
?所有交易都包含以下組件,無論其類型如何:
nonce:發(fā)送者發(fā)送交易數(shù)的計數(shù)
gasPrice:發(fā)送者愿意支付執(zhí)行交易所需的每個gas的Wei數(shù)量
gasLimit:發(fā)送者愿意為執(zhí)行交易支付gas數(shù)量的最大值俊柔。這個數(shù)量被設(shè)置之后在任何計算完成之前就會被提前扣掉
to:接收者的地址筹麸。在合約創(chuàng)建交易中纳猫,合約賬戶的地址還沒有存在,所以值先空著
value:從發(fā)送者轉(zhuǎn)移到接收者的Wei數(shù)量竹捉。在合約創(chuàng)建交易中,value作為新建合約賬戶的開始余額
v,r,s:用于產(chǎn)生標識交易發(fā)生著的簽名
init(只有在合約創(chuàng)建交易中存在):用來初始化新合約賬戶的EVM代碼片段尚骄。init值會執(zhí)行一次块差,然后就會被丟棄。當init第一次執(zhí)行的時候倔丈,它返回一個賬戶代碼體憨闰,也就是永久與合約賬戶關(guān)聯(lián)的一段代碼。
data(可選域需五,只有在消息通信中存在):消息通話中的輸入數(shù)據(jù)(也就是參數(shù))鹉动。例如,如果智能合約就是一個域名注冊服務(wù)宏邮,那么調(diào)用合約可能就會期待輸入域例如域名和IP地址
我們在“?賬戶?”這部分了解到泽示,交易(包括消息通話和創(chuàng)建合約的交易)總是由外部擁有的賬戶發(fā)起并提交給區(qū)塊鏈。另一種思考的方式是交易是外部世界與以太坊內(nèi)部狀態(tài)的橋梁蜜氨。
但這并不意味著合約不能與其他合約談判械筛。在以太坊國家的全球范圍內(nèi)存在的合約可以與同一范圍內(nèi)的其他合約進行談判。他們這樣做的方式是通過“消息”或“內(nèi)部交易”到其他合約飒炎。我們可以將消息或內(nèi)部交易視為與交易相似埋哟,主要區(qū)別在于它們不是由外部擁有的賬戶生成的。相反郎汪,它們是由合約生成的赤赊。它們是虛擬對象,與交易不同煞赢,它不是序列化的抛计,只存在于以太坊執(zhí)行環(huán)境中。
當一份合約將內(nèi)部交易發(fā)送給另一份合約時耕驰,執(zhí)行接收者合約賬戶上存在的相關(guān)代碼爷辱。
一個重要的事情要注意的是,內(nèi)部交易或消息不包含gas限制朦肘。這是因為gas限制是由原始交易的外部創(chuàng)造者(即一些外部擁有的賬戶)決定的饭弓。
外部擁有賬戶所設(shè)置的Gas限額必須足夠高以執(zhí)行交易,包括由于該交易而發(fā)生的任何子執(zhí)行媒抠,例如合約到合約的消息弟断。如果在交易和消息鏈中,特定的消息執(zhí)行耗盡趴生,那么該消息的執(zhí)行將與執(zhí)行所觸發(fā)的任何后續(xù)消息一起還原阀趴。但是昏翰,父執(zhí)行不需要恢復(fù)。
布尼區(qū)塊鏈
擁抱區(qū)塊鏈未來
打造最有價值的區(qū)塊鏈學(xué)習(xí)&交流社群