以太坊中的交易及交易費用
交易
一筆交易是一條訊息,從一個賬戶傳送到另一個賬戶(可能是相同的賬戶或者零賬戶,見下文)。交易可以包含二進位制資料(payload)和以太幣。
如果目標賬戶包含程式碼,該程式碼會執行,payload就是輸入資料。
如果目標賬戶是零賬戶(賬戶地址是0),交易將建立一個新合約。正如上文所講,這個合約地址不是零地址,而是由合約建立者的地址和該地址發出過的交易數量(被稱為nonce)計算得到。建立合約交易的payload被當作EVM位元組碼執行。執行的輸出做為合約程式碼被永久儲存。這意味著,為了建立一個合約,你不需要向合約傳送真正的合約程式碼,而是傳送能夠返回真正程式碼的程式碼。
油:Gas
以太坊上的每筆交易都會被收取一定數量的gas,gas的目的是限制執行交易所需的工作量,同時為執行支付費用。當EVM執行交易時,gas將按照特定規則被逐漸消耗。
油價:gas price
gas price(以太幣計)是由交易建立者設定的,傳送賬戶需要預付的交易費用 = gas price * gas amount。 如果執行結束還有gas剩餘,這些gas將被返還給傳送賬戶。
無論執行到什麼位置,一旦gas被耗盡(比如降為負值),將會觸發一個out-of-gas異常。當前呼叫幀所做的所有狀態修改都將被回滾。
交易費上限: gas limit
每筆交易都被要求包括一個gas limit(有的時候被稱為startGas)和一個交易願為單位gas支付的費用。礦工可以有選擇的打包這些交易並收取這些費用。在現實中,今天所有的交易最終都是由礦工選擇的,但是使用者所選擇支付的交易費用多少會影響到該交易被打包所需等待的時長。如果該交易由於計算,包括原始訊息和一些觸發的其他訊息,需要使用的gas數量小於或等於所設定的gas limit,那麼這個交易會被處理。如果gas總消耗超過gas limit,那麼所有的操作都會被複原,但交易是成立的並且交易費任會被礦工收取。區塊鏈會顯示這筆交易完成嘗試,但因為沒有提供足夠的gas導致所有的合約命令都被複原。所以交易裡沒有被使用的超量gas都會以以太幣的形式打回給交易發起者。因為gas消耗一般只是一個大致估算,所以許多使用者會超額支付gas來保證他們的交易會被接受。這沒什麼問題,因為多餘的gas會被退回給你。
你可以將gasLimit理解為你汽車油箱的上限。同時將gasPrice理解為油價。
區塊交易費上限:block gas limit
區塊gas limit是單個區塊允許的最多gas總量,以此可以用來決定單個區塊中能打包多少筆交易。例如,我們有5筆交易的gas limit分別是10、20、30、40和50.如果區塊gas limit是100,那麼前4筆交易就能被成功打包進入這個區塊。礦工有權決定將哪些交易打包入區塊。所以,另一個礦工可以選擇打包最後兩筆交易進入這個區塊(50+40),然後再將第一筆交易打包(10)。如果你嘗試將一個會使用超過當前區塊gas limit的交易打包,這個交易會被網路拒絕,你的以太坊客戶端會反饋錯誤”交易超過區塊gas limit”。以下例子是來自於以太坊StackExhcange的帖子。
目前區塊的gas limit是 4,712,357 gas,資料來自於ethstats.net,這表示著大約224筆轉賬交易(gas limit為21000)可以被塞進一個區塊(區塊時間大約在15-20秒間波動)。這個協議允許每個區塊的礦工調整區塊gas limit,任意加減 1/2024(0.0976%)。
最佳實踐
幫助理解這些概念的最好辦法就是實踐,推薦兩個匯智網提供的出色的線上教程: