JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

從錢包到區塊:一筆交易的旅程

你按下「傳送」,畫面出現轉圈圈。在接下來的幾秒鐘裡,你的交易會被簽名、在數千台電腦間散播、排進候車室、被拍賣進一個區塊,再慢慢被一層層確認埋住。讓我們全程跟著它走一遍。

那個你從沒看過背後的轉圈圈

想像 Alice 用手機轉 1 ETH 給 Bob。她輸入金額、按下 傳送,錢包顯示 Pending…(待處理)並轉著圈圈。四十秒後它變成 Confirmed(已確認)。對 Alice 來說這像是「一件事」,但其實是一段穿越全球、無領導者網路的小旅程——沒有銀行替這筆款項選路,沒有伺服器保管這個佇列。在前四篇導覽裡,你已經解剖過區塊交易,也學會了帳本記帳的兩大流派(UTXO 與帳戶模型)。這篇導覽會把整個學習階段串起來:跟著 一筆 交易,從 Alice 的錢包一路走進被確認的區塊。

我們會把這趟旅程拆成七站:組裝、簽名、廣播、散播、等待、納入、確認。 每一站都是真實、各自獨立的機制;搞懂它們,就是「對著卡住的轉圈圈一臉茫然」與「清楚知道你的錢正停在哪一站」之間的差別。

第 1–4 站:組裝、簽名,然後把它放進網路

首先錢包會 組裝 交易物件:誰付款、誰收款、金額多少,以及你上一篇認識的記帳欄位——nonce(Alice 個人的交易計數器,這是她的第 7 筆,所以 nonce 為 6)與費用欄位。接著它會 簽名:錢包把交易雜湊後,用 Alice 的私鑰產生一枚數位簽章。這枚簽章 本身 就是授權;過程中完全不會傳送任何密碼。

{
  "type": "0x2",                  // EIP-1559 ("type-2") transaction
  "chainId": 1,                   // 1 = Ethereum mainnet
  "nonce": 6,                     // Alice's 7th transaction
  "to":   "0xBob...",
  "value": "1 ETH",
  "gasLimit": 21000,              // a plain ETH transfer costs exactly this
  "maxPriorityFeePerGas": "2 gwei",   // the tip Alice offers the proposer
  "maxFeePerGas":         "40 gwei"   // the most she'll pay per gas, total
}
錢包組裝出來的交易,以人類看得懂的單位呈現。送出前,它會被 RLP 編碼並簽名,壓成一串難以閱讀的十六進位資料。

接著是 廣播。錢包不會寄信給銀行,而是透過一個 JSON-RPC 呼叫,把已簽名的資料交給 某一個 節點——通常是你錢包背後的 RPC 端點。那個節點就是 Alice 通往網路的入口匝道。它會檢查交易格式正確、簽章有效,然後做最神奇的一步:告訴它的鄰居們。

{
  "jsonrpc": "2.0",
  "method": "eth_sendRawTransaction",
  "params": ["0x02f86b0106847735940084773594008252089..."],
  "id": 1
}
錢包真正送給節點的請求:一個方法、一個已簽名的十六進位參數。

接著是第四站,散播。節點之間組成一個點對點網路:每個節點連著數十個同儕,沒有中央樞紐。當一個節點聽到一筆它沒看過的有效新交易,就把它轉發給同儕,同儕再轉發給自己的同儕。這種洪泛式擴散——稱為交易傳播——通常在 一到兩秒 內就能觸及網路大部分節點。過程中沒有任何主清單;這筆交易就像謠言一樣自行擴散,直到幾乎人人皆知。

第 5 站:記憶池,一間沒有固定座位的候車室

Alice 的交易現在已經有效、廣為人知,但還沒被寫進帳本。它停在記憶池(memory pool)裡:那是每個節點手上握著、已簽名、正等著被放進某個區塊的交易集合。這正是你錢包顯示的 Pending(待處理)狀態。

這裡有第一個常讓人絆倒的意外:根本不存在單一、官方的記憶池。 每個節點保留它 自己 碰巧聽到的那一池交易,所以各節點的內容略有不同。沒有全域佇列、也沒有保證的排序——記憶池是一個各節點各自翻攪的集合,不是一條井然有序的隊伍。這種不斷變動、彼此競爭的行為,就是大家口中的記憶池動態

池子不是無限大,所以節點會依費用排序,並在塞滿時 驅逐 出價最低的交易。因此一筆交易可能停留幾秒、幾小時,或者——如果費用出得太低——被悄悄丟掉、根本不被納入。記憶池是一間候車室,不是一張承諾書。

第 6 站(上):費用市場決定誰先上車

一個區塊有固定的gas 上限——在以太坊上約有 3000 萬 gas 的空間,協定的目標值則是 1500 萬。一筆單純的轉帳用掉 21,000 gas,所以粗略估算,一個區塊大約能塞進一千多筆簡單轉帳。當記憶池裡的交易多到塞不下時,它就變成一場拍賣,而你付的價碼就是gas 費

EIP-1559(2021 年)起,以太坊的費用分成兩部分。基礎費用協定 設定,而非由你決定:當區塊比目標值還滿時它會上漲,較空時則下跌,而且——關鍵在這——它會被 銷毀(直接消滅),所以付這筆錢並不會「賄賂」到任何人。在這之上,你再加一筆優先費用,也就是給區塊產生者的小費。這筆小費,就是你為「快」所出的價。

gas_used         = 21,000 gas      # a plain ETH transfer
base_fee         = 20 gwei / gas   # set by the protocol, BURNED
priority_fee     = 2 gwei / gas    # Alice's tip, goes to the proposer

effective_price  = base_fee + priority_fee = 22 gwei / gas
total_fee        = 21,000 * 22 gwei = 462,000 gwei = 0.000462 ETH
                   |__ burned : 21,000 * 20 = 420,000 gwei
                   |__ tip    : 21,000 *  2 =  42,000 gwei  -> proposer

# maxFeePerGas = 40 gwei was just a ceiling. Base fee was only 20,
# so Alice pays 22 and the unused headroom is NOT charged.
整筆費用算給你看。產生者真正「賺到」的只有那 42,000 gwei 的小費;基礎費用則永遠消失了。

交易裡的兩個數字掌控了這一切。`maxFeePerGas`(40 gwei)是 上限——Alice 每單位 gas 願意付的最高價;萬一基礎費用爬到比它還高,她的交易就只能等。`maxPriorityFeePerGas`(2 gwei)則是她的小費。由於基礎費用只有 20,她付 22,而上限與實付之間的差額(到 40 為止)並 不會 被收取。出價更高的小費,理性的產生者就會更早選你;出得太低,你就只能等——甚至被驅逐。

第 6 站(下):產生者把區塊打包

大約每 12 秒,會有一位驗證者被選為該時段的區塊 提議者(這就是權益證明——下一個學習階段整篇都在講它)。它的工作是:組裝出下一個區塊。一個追求利潤最大化的提議者,會把記憶池按「每單位 gas 的小費」排序,貪婪地用最賺錢的交易把區塊填滿,直到觸及 gas 上限。Alice 那 2 gwei 的小費,足以讓她舒舒服服進入下一個區塊;而 0.01 gwei 的小費,可能要等過好多個區塊。

  1. 選取:提議者從自己的記憶池中挑出有效交易,按小費排序(高者優先),並略過任何 nonce 尚未輪到該發送者的交易。
  2. 執行:它把每筆交易套用到當前的世界狀態上——從 Alice 扣 1 ETH 加手續費、把款項記給 Bob——並算出最終的狀態根。
  3. 封裝:它把選中的交易打包進區塊本體,填好標頭(前一區塊雜湊、狀態根、時間戳),並把這個新區塊廣播到網路上。
  4. 驗證:其他每個節點重新執行同樣的交易,核對結果是否一致;若一致,就採用這個區塊作為鏈的新頂端。

第 7 站:確認,然後愈確認愈牢——直到真正定案

Alice 的交易一落進區塊,錢包就翻成 Confirmed——這就是 一個確認。 但這裡有第二個意外:一個確認並不等於確定。鏈對它「最新的那個區塊」可能短暫各執一詞(兩個提議者、網路延遲),於是某個競爭區塊可能勝出,造成一次短暫的重組(reorg),把落敗那條鏈上的交易退回記憶池。

這就是為什麼大家要等 多個確認:每在 Alice 那個區塊之上多疊一個新區塊,要逆轉她的交易就難上指數級,因為攻擊者得從那個深度開始把誠實網路給「蓋過去」。這是 機率性 的安全——上面疊得愈多,信心愈足。比特幣那條 等 6 個確認(約 1 小時)的民間規則,講的正是這個道理。

現代的權益證明再加上了更強的一層:最終性。在以太坊上,驗證者會對檢查點投票,約莫兩個 epoch(約 13 分鐘)之後,Alice 的區塊就會 被最終化——要逆轉它,攻擊者得故意銷毀至少三分之一的全部質押 ETH,也就是數十億美元、白白燒掉。那不只是「非常不可能」,而是 經濟上的自殺。機率性確認說的是 大概不會被逆轉;最終性說的是 不付出可被證明的災難性自我懲罰,就無法逆轉。權益證明那個學習階段會把這套機制完整鋪開。

當轉圈圈停不下來:卡住與被替換的交易

現在你已經能診斷最常見的故障了。Alice 的交易卡在 Pending 整整十分鐘,為什麼?答案幾乎總是:基礎費用漲到比她的 `maxFeePerGas` 還高,或她的小費低於提議者正在收的水準,所以沒人選她。她有三個正當的選項。

  1. 加速(替換):重新廣播一筆 nonce 相同(6)但費用更高的新交易。提議者納入哪一個版本,另一個就失效——你無法把 nonce 6 花兩次。這就是「以費換位」(replace-by-fee)。
  2. 取消:發一筆 0 ETH 給你自己的交易,同樣用 nonce 6 並出更高費用。若它先被納入,就會用掉這個 nonce,原本那筆付款便永遠無法落地。
  3. 等待:若費用是暫時暴衝,基礎費用通常幾個區塊內就會回落,原本那筆交易便會自行被選中。耐心不用錢。

這就是完整的旅程:Alice 組裝簽名 了一筆交易、把它 廣播 給一個節點、看著它在點對點網路散播、在記憶池等待、透過一場付費拍賣被 納入,最後 確認——先是機率性地,再達到真正的最終性。沒有任何銀行參與這一切;是數千台陌生人的電腦,遵循同一套規則,完成了全部。下一個學習階段,我們就來掀開這些電腦究竟 如何 對「哪個區塊勝出」達成一致——共識與權益證明。