文組也該知道的區塊鏈技術知識 <5> 不可不知的以太坊交易打包規則

Blockchain Technical Overview <5> Behind The ETH Transaction

Vins Lai @vins.ton
Pelith
8 min readSep 12, 2019

--

收看本系列文章的讀者,應該都對於區塊鏈的基本原理和架構有些概念,如果沒有,推薦您先去 Google 搜尋 區塊鏈、比特幣、以太坊這些關鍵字了解一下。我們將在這些基礎概念之上,來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研,而是希望以深入淺出的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出:原來如此!

奇怪,我的交易怎麼一直送不出去?

相信大家或多或少都曾遇到或被問過這樣的問題。在 第 3 篇第 4 篇 文章中我們藉由區塊鏈代幣的演進史來解析 Token 背後的技術運作原理,大家對於智慧合約應該有更深一層的認識與了解。本篇我們要來帶大家細看以太坊交易背後的知識與原理:

*究竟在我們送出交易後到出塊上鏈之間發生了哪些事?
*為什麼以太坊會塞車?
*交易塞車在技術上到底是發生了什麼事?
*交易送不出去要怎麼辦?

以上這些常見的問題應該都能在本篇文章中得到解答。

以太坊交易的本質

首先,大家應該都還記得在 第一篇 中談到了以太坊交易的本質,我給你 10 Ether 不是我真的把什麼東西給了你,而是我向以太坊網絡提出了更改餘額狀態的請求,讓各個節點上紀錄的 你與我的 Ether Balance 進行更新。

Ethereum 交易之狀態更新示意圖

然而,送出交易在技術上並不困難,區塊鏈的重點是在於打包交易並出塊的過程。如何驗證、確認交易是否有效,讓這筆交易順利發生,並讓各個節點即時更新以擁有相同的帳本,這樣打包交易並出塊的機制即「挖礦」

以太坊交易送出至出塊的流程

以太坊交易送出至出塊流程 (https://web3j.readthedocs.io/en/latest/transactions.html)

透過上圖我們可以一覽

以太坊上一筆交易送出後經歷的流程

  1. 發送交易
  2. 私鑰簽名
  3. 交易發送至節點
  4. 節點間廣播新接收交易
  5. 礦工打包交易並出塊

上圖可能有些細節交代不夠清楚,我們再用下面這張圖來補充說明:

MyEtherWallet 交易送出後經歷的流程示意圖 (https://kb.myetherwallet.com/)

交易送出之後,會被丟進一個「交易池」裡,等待被礦工打包。
礦工從「交易池」中撈出未出塊的交易來進行打包與出塊。

因為每個區塊有大小限制,比特幣一個區塊是 1MB 的容量限制以太坊的區塊則是以 Gas 來計算,有 800 萬 Gas 的限制。若以一筆基礎交易 21,000 Gas 來計算,一個以太坊區塊可以容納 380 筆交易。因此當「交易池」裡的交易量大時,會有許多交易沒辦法即時被打包而滯留在池子中等待。

如何挑選要撈出哪些交易?

礦工節點可以自行設置參數,不過大多數礦工都是按造手續費的多寡排序,手續費高的會優先被打包出塊;手續費低的則可能要等到天荒地老。

回顧 第一節 我們介紹過的以太坊手續費計算公式:

以太坊交易手續費公式:
Tx Fee(手續費)= Gas Used(燃料用量) * Gas Price(單位燃料價格)

由於 Gas Used 是由系統決定的,我們在發送交易時決定手續費多寡的決定性變因就是 Gas Price 了。下方我們以 Metamask 介面來做介紹:

Metamask 發送交易的頁面流程圖

在上圖左方我們可以看到系統預設有三個速度可以供選擇,不過要更近一步設定,可以點「進階選項」,便會進到上圖右方的畫面。

我們可以自行設定 Gas Price 及 調整交易的 Gas Limit。WEI 是以太坊上最小的單位(10^-18 Ether);GWEI(10^-9 Ether)則是 1G 的 WEI。
圖中的 Gas Price 設定為 10 GWEI;Gas Limit 為 21,000。因此:

10 GWEI(單位燃料價格)* 21,000(燃料用量)= 0.00021 Ether(手續費)

Gas Limit

若是要操作智慧合約等較繁複的功能,不太確定實際的 Gas Used,也可以把 Gas Limit 調高一些,被打包時只會收取實際 Gas Used 作為手續費,多給的 Gas 會退返回來。

不過由於以太坊區塊有 800 萬 Gas 的大小限制,若把 Gas Limit 設太高,也可能產生塞不進區塊中滯留在「交易池」裡的情況。

GWEI

至於要設多少 GWEI,我們可以到 ETH gas station 上查看即時的「交易池」狀況:

ETH GAS STATION 上的 Gas Price 建議

可以看到如果希望交易能盡快被確認,GWEI 可能要設到 20 以上,大約在 2 分鐘內可以被確認完成(不過通常設到 FAST,應該 15~30 秒就會被確認了)。截圖當下其實是偏塞車的情形,通常 10 GWEI 左右就可以達到 FAST(<2 mins),截圖當下卻要 20 GWEI。

這邊顯示的 Gas Price 建議,其實就是「交易池」裡的狀況:池裡有多少筆 pending 的交易、這些池裡的交易給的手續費是多少。根據這些資訊依據來呈現設的 Gas Price 估計要多少個區塊(時間)後才會被打包上鏈。

然而,許多人常遇到關於交易的問題:

我的交易怎麼一直送不出去怎麼辦?

也許是 Gas Price 設太低,或是突然有大量交易湧入等各樣的情況。這時其實有補救的方法:

加速交易

當交易由 Metamask 送出後,可以看到下方會有個「加速」的按鈕,點進去後便可以再次設定 Gas Price,設定並重新送出交易後,就可以在底下的活動紀錄看到手續費被提高了。

加速交易的流程圖

取消交易

除了能加速交易,其實也可以取消交易。方法便是點擊等待處理的交易,展開後可以看到「取消」的按鈕,點擊並確認後 Metamask 會向節點發送取消交易的請求,並在確認取消後收取手續費。

若發現取消交易的請求 pending 有點久,其實在下方可以看到有「加速取消」的按鈕,可以再進行進一步設定。

取消交易的流程圖

那麼,以上這些過程其實是發生了什麼事,技術上如何做到的呢?
答案跟我們在 第一節 談到的 nonce 有關,做法是:

再發送一個同樣 nonce 的交易

由於以太坊 nonce 的設計,會追蹤每個地址所有交易的「序次」,也就是說每個 nonce 只會有一筆交易

加速交易

因此加速交易便是我再發送一筆同個 nonce、同樣內容的交易。因為提高了交易手續費,所以當同樣 nonce 的兩個交易都位於「交易池」中後發的手續費較高的交易原則上會被優先打包出塊。因為每個 nonce 只能有一筆交易,先發的那筆手續費較低的交易永遠不會被打包,於是便會被系統給丟棄,因而交易失敗。

取消交易

取消交易其實也是類似的邏輯,做法是:
我再發送一筆給自己 0 Ether 的同 nonce 交易。
由於這筆交易手續費較高,會優先被打包出塊,讓原交易被系統丟棄而交易失敗,如此來達到取消交易的目的。

結論

  1. 交易送出後會被丟到一個「交易池」中等待被礦工打包,決定先後順序的主要因子為「單位 Gas Price(GWEI)」給的多寡。
  2. 發送交易時可以到 ETH gas station 參考即時的「交易池」狀況再來決定要設多少 GWEI 以能在預期的時間內被打包上鏈。
  3. 若發現交易持續滯留在「交易池」中等待被處理,可以「加速交易」或「取消交易」。

介紹至此,大家應該都對以太坊交易的背後邏輯與打包規則有更深一層的認識了。下一節 我們將更完整且完整地介紹區塊鏈架構,帶各位讀者一同檢視中本聰設計的初代區塊鏈:比特幣 Bitcoin 是如何運作的。

傳送門:文組也該知道的區塊鏈技術知識 <6> 一次搞懂「區塊鏈架構」

以上,若有任何

A. 我寫得不夠清楚的地方
B. 撰寫上改進的建議
C. 希望我能夠撰寫分享的區塊鏈技術知識內容

都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫,也希望能
*不吝嗇給我 Like / 50 claps
*分享給您的朋友們
謝謝大家!

--

--

Vins Lai @vins.ton
Pelith
Editor for

Co-Founder of Aurora Card - World's First Crypto Credit Card built on Trust with supreme Privacy, sign up: https://app.aurora-card.com/signup?userRef=N527Zi