跳至主要内容
Change page

交易

頁面最後更新時間: 2026年2月23日

交易是帳戶發出的帶密碼學簽章的指令。 帳戶將發起交易以更新以太坊網路的狀態。 最簡單的交易是將以太幣從一個帳戶轉帳到另一個帳戶。

先決條件

為協助您更了解本頁,建議您先閱讀 帳戶 和我們的 以太坊簡介

什麼是交易?

以太坊交易是指由外部帳戶發起的操作,換句話說,此帳戶是由人而不是智慧型合約管理的帳戶。 例如,如果 Bob 發送給 Alice 1 以太幣,Bob 的帳戶必須扣除,Alice 的帳戶必須存入。 此更改狀態的操作發生在交易中。

顯示交易導致狀態變更的圖表 圖表改編自 Ethereum EVM 圖解 (opens in a new tab)

交易會改變以太坊虛擬機的狀態,須廣播至整個網路。 任何節點都可以廣播要在以太坊虛擬機上執行的交易請求;之後驗證者將執行交易並將引起的狀態變化傳播到網路上的其他節點。

交易需要支付費用並需要添加至經過驗證的區塊中。 為了讓本文更好理解,我們會在其他地方講解燃料和驗證。

提交的交易包括下列資訊:

  • from – 發送者的地址,將會用來簽署交易。 這將是一個外部擁有的帳戶,因爲合約帳戶無法傳送交易
  • to – 接收地址 (若是外部擁有的帳戶,此交易將會轉移價值。 如果為合約帳戶,交易將執行合約程式碼)
  • signature – 發送者的識別碼。 當發送者以私密金鑰簽署交易並確認發送者已授權此交易时,就會產生此簽章。
  • nonce - 一個循序遞增的計數器,代表來自該帳戶的交易編號
  • value – 從發送者轉移到接收者的 ETH 數量 (以 WEI 為單位,其中 1 ETH 等於 1e+18 wei)
  • input data – 選填欄位,可包含任意資料
  • gasLimit – 交易可消耗的 Gas 單位上限。 EVM 指定了每個運算步驟所需的 Gas 單位
  • maxPriorityFeePerGas - 可作為給驗證程式小費的每單位 Gas 最高價格
  • maxFeePerGas - 願意為此交易支付的每單位 Gas 最高費用 (包含 baseFeePerGasmaxPriorityFeePerGas)

燃料指請驗證者處理交易所需的計算。 使用者必須為計算支付費用。 gasLimitmaxPriorityFeePerGas 決定支付給驗證程式的最高交易費用。 更多關於 Gas 的資訊

交易物件看起來有些像以下內容:

1{
2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
4 gasLimit: "21000",
5 maxFeePerGas: "300",
6 maxPriorityFeePerGas: "10",
7 nonce: "0",
8 value: "10000000000"
9}
顯示全部

但交易物件需要使用發送者的私密金鑰簽署。 這證明交易只可能來自發送者,而不是以欺詐方式發送。

Geth 之類的以太坊用戶端將處理此簽署過程。

範例 JSON-RPC 呼叫:

1{
2 "id": 2,
3 "jsonrpc": "2.0",
4 "method": "account_signTransaction",
5 "params": [
6 {
7 "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
8 "gas": "0x55555",
9 "maxFeePerGas": "0x1234",
10 "maxPriorityFeePerGas": "0x1234",
11 "input": "0xabcd",
12 "nonce": "0x0",
13 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
14 "value": "0x1234"
15 }
16 ]
17}
顯示全部

回應範例:

1{
2 "jsonrpc": "2.0",
3 "id": 2,
4 "result": {
5 "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
6 "tx": {
7 "nonce": "0x0",
8 "maxFeePerGas": "0x1234",
9 "maxPriorityFeePerGas": "0x1234",
10 "gas": "0x55555",
11 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
12 "value": "0x1234",
13 "input": "0xabcd",
14 "v": "0x26",
15 "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",
16 "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
17 "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"
18 }
19 }
20}
顯示全部

交易具備簽章雜湊值,因此可通過加密技術證明交易來自發送者並提交至網路。

資料欄位

大多數交易從外部帳戶存取合約。 大多數合約以 Solidity 撰寫,並根據 解譯其資料欄位。

前四個字節位元組使用函式名稱及參數的雜湊值指定要呼叫的函式。 有時您可以使用此資料庫 (opens in a new tab) 來從選擇器識別函式。

calldata 的其餘部分是引數,根據 ABI 規格中的指定方式進行編碼 (opens in a new tab)

例如,我們來看看這筆交易 (opens in a new tab)。 使用 Click to see More 檢視 calldata。

函式選擇器是 0xa9059cbb。 有數個已知函式具有此簽章 (opens in a new tab)。 在本案例中,合約原始碼 (opens in a new tab)已上傳至 Etherscan,因此我們知道函式為 transfer(address,uint256)

其餘資料如下所示:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4

根據 ABI 規範,應用程式介面中的整數值(例如地址,20 字節位元組的整數)顯示為 32 字節位元組的字,並且前面用 0 來填補。 因此我們知道 to 地址是 4f6742badb049791cd9a37ea913f2bac38d01279 (opens in a new tab)value 為 0x3b0559f4 = 990206452。

交易類型

以太坊上有幾種不同類型的交易:

  • 一般交易:從一個帳戶至另一個帳戶的交易。
  • 合約部署交易:沒有「to」地址的交易,其資料欄供合約程式碼所用。
  • 合約執行:與部署的智慧型合約互動的交易。 在本例中,「to」地址為智慧型合約的地址。

關於 Gas

如前所述,執行交易需要花費 Gas。 簡單的轉帳交易需要 21000 單位燃料。

因此,如果 Bob 要在 baseFeePerGas 為 190 gwei 且 maxPriorityFeePerGas 為 10 gwei 的情況下,傳送 1 ETH 給 Alice,Bob 將需要支付下列費用:

1(190 + 10) * 21000 = 4,200,000 gwei
2--或者--
30.0042 以太幣

Bob 的帳戶將會被扣款 -1.0042 ETH (1 ETH 給 Alice + 0.0042 ETH 的 Gas 費用)

Alice 的帳戶將會存入 +1.0 ETH

基本費用將被銷毀 -0.00399 ETH

驗證程式保留小費 +0.000210 ETH

顯示未使用 Gas 如何退款的圖表 圖表改編自 Ethereum EVM 圖解 (opens in a new tab)

任何交易中未使用的燃料都會退還給使用者帳戶。

智慧合約互動

任何涉及智慧型合約的交易都需要燃料。

智慧合約也可以包含 view (opens in a new tab)pure (opens in a new tab) 函式,這些函式不會改變合約的狀態。 因此,從外部帳戶調用這些函數不需要任何燃料。 此情境的底層 RPC 呼叫是 eth_call

與使用 eth_call 存取不同,這些 viewpure 函式也常在內部被呼叫 (即從合約本身或從另一個合約呼叫),這確實會花費 Gas。

交易生命週期

一旦交易被提交,就會發生以下情況:

  1. 交易哈希是以密碼學方式產生的: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. 然後該交易會廣播到網路並添加到交易池中,交易池中包含了其他所有等待中的網路交易。
  3. 為了要驗證交易並使交易「成功」,驗證者必須選擇你的交易並將它打包進區塊中。
  4. 隨著時間推移,含有你交易的區塊會被升級為「已證明」,然後是「最終化」。 這些升級能讓您更加 確定交易成功,且永遠不會被更改。 一旦區塊「最終確認」,就只能透過 耗資數十億美元的網路層級攻擊才能更改。

視覺化示範

觀看 Austin 為你講解交易、燃料和挖礦。

類型化交易封包

以太坊最初有一種形式的交易。 每筆交易都包含 nonce、gas price、gas limit、to address、value、data、v、r 與 s。 這些欄位經過 RLP 編碼後,看起來像這樣:

RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])

以太坊已演進到支援多種類型的交易,以便在實作存取清單和 EIP-1559 (opens in a new tab) 等新功能時,不會影響舊有交易格式。

EIP-2718 (opens in a new tab) 實現了這種行為。 交易的解釋如下:

TransactionType || TransactionPayload

其欄位定義如下:

  • TransactionType - 一個介於 0 和 0x7f 之間的數字,總共有 128 種可能的交易類型。
  • TransactionPayload - 由交易類型定義的任意位元組陣列。

根據 TransactionType 的值,交易可分類為:

  1. 類型 0 (傳統) 交易: 自以太坊推出以來使用的原始交易格式。 它們不包含 EIP-1559 (opens in a new tab) 的功能,例如動態 Gas 費用計算或智慧合約的存取清單。 傳統交易在其序列化形式中缺少指示其類型的特定前綴,在使用遞迴長度前綴 (RLP) 編碼時以位元組 0xf8 開頭。 這些交易的 TransactionType 值為 0x0

  2. 類型 1 交易:EIP-2930 (opens in a new tab) 中作為以太坊柏林升級 的一部分引入,這些交易包含一個 accessList 參數。 此清單指定了交易預期存取的地址和儲存金鑰,有助於潛在降低涉及智慧合約的複雜交易的 Gas 成本。 EIP-1559 的費用市場變化不會包含在類型 1 交易中。 類型 1 交易也包含一個 yParity 參數,可以是 0x00x1,表示 secp256k1 簽章的 y 值的奇偶性。 它們以位元組 0x01 開頭來識別,其 TransactionType 值為 0x1

  3. 類型 2 交易,通常稱為 EIP-1559 交易,是在以太坊倫敦升級EIP-1559 (opens in a new tab) 中引入的交易。 這類交易已成為以太坊網路上的標準交易類型。 這些交易引入了一種新的費用市場機制,透過將交易費用分為基本費用和優先費來提高可預測性。 它們以位元組 0x02 開頭,並包含 maxPriorityFeePerGasmaxFeePerGas 等欄位。 類型 2 交易因其靈活性和效率而成為預設交易,在網路高度擁塞期間尤其受到青睞,因為它們能夠幫助使用者更好地預測及管理交易費用。 這些交易的 TransactionType 值為 0x2

  4. 類型 3 (Blob) 交易EIP-4844 (opens in a new tab) 中作為以太坊 Dencun 升級 的一部分被引入。 這些交易旨在更高效地處理「blob」資料 (二進位大型物件),它們提供了一種以更低成本將資料發佈到以太坊網路的方法,尤其有利於二層網路卷軸。 Blob 交易包含額外欄位,例如 blobVersionedHashesmaxFeePerBlobGasblobGasPrice。 它們以位元組 0x03 開頭,其 TransactionType 值為 0x3。 Blob 交易代表了以太坊在資料可用性和可擴張性方面的重大改進。

  5. 類型 4 交易是在EIP-7702 (opens in a new tab) 中作為以太坊 Pectra 升級 的一部分引入的。 這些交易被設計為與帳戶抽象化向前相容。 它們允許 EOA 暫時表現得像智慧合約帳戶,而不會影響其原始功能。 它們包含一個 authorization_list 參數,用於指定 EOA 將其權限委派給哪個智慧合約。 交易後,EOA 的程式碼欄位將包含被委派的智慧合約地址。

延伸閱讀

知道一個曾經幫助你學習更多社區或社團資源? 歡迎在本頁自由編輯或添加內容!

這篇文章對你有幫助嗎?