Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

以太坊交易機制完全指南

目錄


ETH vs ERC-20 核心差異

本質區別

ETH = 以太坊的"血液" 🔵

ETH(以太幣/Ether):
├─ 🏗️ 區塊鏈原生資產
├─ 💎 直接內建在協議層
├─ 🔐 不需要任何合約
├─ ⚡ 直接記錄在區塊鏈狀態
└─ ⛽ 用來支付 Gas Fee(燃料)

ETH 的特性:

  • 以太坊網路的原生加密貨幣
  • 區塊鏈協議的一部分
  • 所有操作的"燃料"
  • 無法被"創建"或"銷毀"(除了通過挖礦/質押和銷毀機制)

ERC-20 = 在以太坊上的"應用層代幣" 📜

ERC-20 代幣(如 USDT、USDC、LINK):
├─ 📜 是智能合約
├─ 🏗️ 建立在以太坊之上
├─ 💾 由合約記錄餘額
├─ ⚙️ 需要調用合約函數
└─ 💰 不能用來支付 Gas Fee

ERC-20 的特性:

  • 是部署在以太坊上的智能合約
  • 任何人都可以創建
  • 需要符合 ERC-20 標準接口
  • 需要 ETH 來支付操作的 Gas Fee

詳細對比表

比較項目ETH (原生代幣)ERC-20 代幣 (如 USDT)
本質區塊鏈協議的一部分智能合約
存在位置直接在區塊鏈狀態中合約的資料結構中
餘額記錄區塊鏈直接記錄每個地址的 ETH合約的 mapping 記錄餘額
轉帳方式直接修改區塊鏈狀態調用合約的 transfer 函數
Gas Fee✅ 可以用來支付 Gas❌ 不能支付 Gas
合約地址沒有合約地址有合約地址(如 0xdac17f...)
是否需要 ETH就是 ETH✅ 需要 ETH 支付 Gas
交易類型Value TransferContract Interaction
複雜度簡單複雜(需執行合約)
Gas 消耗固定 21,000 gas約 50,000-80,000 gas
創建方式協議發行任何人都可以創建
數量只有一個 ETH成千上萬種 ERC-20 代幣

儲存方式的差異

ETH 的儲存

區塊鏈的全局狀態(State):

Account: 0xABC...
├─ Balance: 10 ETH
├─ Nonce: 25
├─ Code: (empty)
└─ Storage: (empty)

Account: 0xDEF...
├─ Balance: 5 ETH
├─ Nonce: 10
├─ Code: (empty)
└─ Storage: (empty)

直接記錄在區塊鏈的帳戶狀態中
不需要任何中介

ERC-20 的儲存

USDT 智能合約(0xdac17f958d2ee523a2206206994597c13d831ec7)

Contract Account:
├─ Balance: 0 ETH (合約本身可能沒有 ETH)
├─ Code: 智能合約位元組碼
└─ Storage:
    ├─ totalSupply = 100,000,000,000 USDT
    ├─ balances[0xABC...] = 1,000 USDT
    ├─ balances[0xDEF...] = 5,500 USDT
    ├─ balances[0xGHI...] = 100 USDT
    └─ ... (所有持有者的餘額)

記錄在合約的 Storage 中
通過 mapping(address => uint256) 數據結構

關鍵理解:

你的地址(0xABC...)實際上:
├─ 直接"擁有" 10 ETH(記錄在區塊鏈狀態)
└─ 在 USDT 合約的帳本上有 1,000 USDT 的記錄

形象比喻

以太坊 = 一個國家

🏛️ 以太坊區塊鏈(國家基礎設施)
    │
    ├─ 💵 ETH = 法定貨幣(美元/臺幣)
    │   ├─ 政府直接發行和管理
    │   ├─ 用來支付稅費(Gas Fee)
    │   ├─ 所有人都必須使用
    │   ├─ 可以直接存在銀行帳戶(地址)
    │   └─ 是國家經濟的基礎
    │
    └─ 🎫 ERC-20 代幣 = 各種私人發行的代幣/點數
        ├─ 遊樂園代幣(USDT - 穩定幣)
        ├─ 商場積分(LINK - 功能代幣)
        ├─ 會員卡點數(UNI - 治理代幣)
        ├─ 在這個國家內可以流通和交易
        ├─ 但不能用來交稅(不能付 Gas)
        └─ 想使用還是需要法定貨幣(ETH)

查詢方式的差異

查詢 ETH 餘額

// Web3.js
const ethBalance = await web3.eth.getBalance("0xYourAddress");
console.log(`ETH 餘額: ${web3.utils.fromWei(ethBalance, 'ether')} ETH`);

// 特點:
// ✅ 直接查詢區塊鏈狀態
// ✅ 不需要知道合約地址
// ✅ 簡單快速

查詢 ERC-20 餘額

// 需要知道代幣的合約地址
const usdtAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";

// 需要合約 ABI(接口定義)
const usdtContract = new web3.eth.Contract(ERC20_ABI, usdtAddress);

// 調用合約的 balanceOf 函數
const usdtBalance = await usdtContract.methods
    .balanceOf("0xYourAddress")
    .call();
    
console.log(`USDT 餘額: ${usdtBalance / 1e6} USDT`);

// 特點:
// ⚙️ 需要調用智能合約
// ⚙️ 需要知道合約地址
// ⚙️ 需要合約 ABI
// ⚙️ 相對複雜

完整的交易流程

交易流程概覽

用戶創建交易(本地)
    ↓ 免費
簽名交易(本地)
    ↓ 免費 ✅ TXID 在這裡產生!
廣播到網路(P2P 傳播)
    ↓ 免費
進入 Mempool(交易池)
    ↓ 免費
驗證者選擇交易(根據 Gas Price)
    ↓
驗證和執行交易(消耗算力)
    ↓ 💰 需要 Gas Fee
打包進區塊(上鏈)
    ↓
區塊確認(共識)
    ↓
交易完成 ✅

TXID(交易哈希)何時產生?⭐

核心答案:在第 2 步「簽名交易」完成後立即產生!

用戶創建交易(本地)
    ↓ 交易對象已建立,但還沒有 TXID
簽名交易(本地)
    ↓ ✅ TXID 在這裡產生!
    ↓ TXID = Keccak256(簽名後的完整交易數據)
廣播到網路(P2P 傳播)
    ↓ 帶著 TXID 一起廣播
進入 Mempool(交易池)
    ↓ 節點用 TXID 來識別和追蹤這筆交易
驗證者選擇交易(根據 Gas Price)
    ↓
驗證和執行交易(消耗算力)
    ↓ 💰 需要 Gas Fee
打包進區塊(上鏈)
    ↓ TXID 被記錄在區塊中
區塊確認(共識)
    ↓
交易完成 ✅

TXID 的詳細生成過程

第 1 步:創建交易對象(還沒有 TXID)

// 交易對象(還沒簽名)
const transaction = {
    from: "0xYourAddress",
    to: "0xReceiverAddress",
    value: "1000000000000000000",  // 1 ETH
    gas: 21000,
    gasPrice: "25000000000",  // 25 Gwei
    nonce: 25,
    chainId: 1
}

// ⚠️ 此時還沒有 TXID
// 因為交易還沒有被簽名,內容可能還會改變

第 2 步:用私鑰簽名(⭐ TXID 產生)

// 1. 用私鑰對交易進行簽名
const signedTransaction = await web3.eth.accounts.signTransaction(
    transaction, 
    privateKey
);

// 2. 簽名後的交易包含:
//    - 原始交易數據
//    - 簽名(v, r, s)

// 3. 對簽名後的完整交易數據進行 Keccak-256 哈希
// ✅ TXID 就此產生!
const txid = web3.utils.keccak256(signedTransaction.rawTransaction);

console.log("TXID:", txid);
// 輸出:0x1234567890abcdef...(64 個十六進制字符)

// ⚠️ 此時交易還在你的電腦上,還沒廣播出去
// 但 TXID 已經確定了,不會再改變

為什麼在簽名後產生?

簽名前:
├─ 交易內容可能改變
├─ 沒有簽名數據
└─ 無法計算最終的哈希值

簽名後:
├─ ✅ 所有數據都確定了
├─ ✅ 包含簽名(v, r, s)
├─ ✅ 內容不會再改變
└─ ✅ 可以計算出唯一的 TXID

TXID 的特性

1. 唯一性

每個 TXID 都是唯一的:
├─ 由簽名後的完整交易數據計算而來
├─ 任何一個字節改變,TXID 就完全不同
├─ 可以用來唯一識別一筆交易
└─ 就像交易的「指紋」或「身分證號」

2. 不可變性

一旦簽名完成,TXID 就確定了:
├─ 即使交易還沒廣播
├─ 即使交易在 Mempool 中等待
├─ 即使交易失敗
└─ TXID 都不會改變

3. 可預知性

在廣播前你就知道 TXID:
├─ 錢包會顯示 TXID
├─ 你可以記錄下來
├─ 可以提前告訴別人這個 TXID
└─ 廣播後用這個 TXID 追蹤交易狀態

在 MetaMask 中觀察 TXID 產生

第 1 步:創建交易
├─ 你輸入接收地址和金額
├─ MetaMask 建立交易對象
└─ 還沒有 TXID

第 2 步:點擊「確認」
├─ MetaMask 用你的私鑰簽名
├─ ✅ TXID 立即產生
├─ MetaMask 顯示「交易已提交」
└─ 顯示 TXID:0xabc123...

第 3 步:廣播
├─ MetaMask 將簽名後的交易廣播出去
├─ 帶著這個 TXID
└─ 你可以用這個 TXID 在 Etherscan 追蹤

第 4 步:追蹤
├─ 複製 TXID
├─ 到 Etherscan 搜尋
└─ 即使交易還在 Pending,也能查到

TXID 的格式

TXID 的標準格式:
├─ 0x 開頭(十六進制標識)
├─ 64 個十六進制字符(0-9, a-f)
├─ 總長度:66 個字符(0x + 64)
└─ 代表 256 bits 的哈希值

範例:
0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef

TXID 的別名:

TXID 也被稱為:
├─ Transaction Hash(交易哈希)
├─ Transaction ID(交易 ID)
├─ Tx Hash
└─ TxID

都是指同一個東西!

TXID 的用途

1. 追蹤交易狀態

在 Etherscan 輸入 TXID:
├─ 查看交易是否確認
├─ 查看 Gas Fee
├─ 查看區塊號
├─ 查看時間戳
└─ 查看執行結果

2. 證明交易

TXID 可以作為憑證:
├─ 證明你發送了交易
├─ 證明交易的時間
├─ 證明交易的金額
└─ 就像收據

3. 客服和技術支援

遇到問題時:
├─ 提供 TXID 給客服
├─ 客服可以查詢交易詳情
├─ 快速定位問題
└─ 提供幫助

特殊情況

情況 1:交易被加速或取消

原始交易:
TXID: 0xabc123...
狀態: Pending

加速交易(用更高 Gas 重發):
├─ 相同的 from、to、value、nonce
├─ 但 Gas Price 更高
├─ ✅ 產生新的 TXID: 0xdef456...
├─ 因為簽名不同,所以哈希不同
└─ 兩個 TXID 中只有一個會被確認

最終:
└─ 0xdef456... 被確認 ✅
└─ 0xabc123... 被丟棄 ❌

情況 2:相同的交易內容

如果兩筆交易:
├─ from 相同
├─ to 相同  
├─ value 相同
├─ nonce 相同
├─ Gas 設置相同
├─ chainId 相同

但:
└─ 簽名時間不同
└─ 或私鑰的隨機數不同(ECDSA 簽名的 k 值)
└─ ✅ TXID 會不同

所以即使是「相同」的交易,
每次簽名產生的 TXID 都可能不同

💡 記憶方式:快遞單號比喻

想像寄快遞:

1. 打包貨物(創建交易)
   └─ 還沒有單號

2. 填寫快遞單並簽名(簽名交易)
   └─ ✅ 快遞單號產生(TXID)
   └─ 這個單號是唯一的

3. 交給快遞員(廣播)
   └─ 帶著這個單號出發

4. 快遞在運送中(Mempool)
   └─ 用單號可以查詢狀態

5. 快遞送達(確認)
   └─ 單號記錄在系統裡

關鍵結論:TXID 在簽名完成後就產生了,這時交易還在你的本地設備上,還沒廣播到網路! 🎯


第 1 步:創建交易(本地,免費)

在你的設備上發生

操作:在 MetaMask 輸入轉帳資訊

創建交易對象:
{
    from: "0xYourAddress",
    to: "0xReceiverAddress",
    value: "1000000000000000000",  // 1 ETH (以 Wei 為單位)
    gas: 21000,                     // Gas Limit
    gasPrice: "25000000000",        // 25 Gwei
    nonce: 25,                      // 帳戶的交易計數
    chainId: 1                      // 以太坊主網
}

消耗:
├─ 你的電腦/手機的一點點算力
├─ 幾毫秒的時間
└─ 完全免費 ✅

用私鑰簽名

簽名過程:
1. 計算交易的雜湊值
2. 用你的私鑰進行 ECDSA 簽名
3. 生成簽名(v, r, s)
4. 附加到交易上

結果:
└─ 簽名後的交易(Signed Transaction)
    └─ 包含了你的授權證明
    └─ 任何人都可以驗證這是你簽名的
    └─ 但無法偽造簽名

第 2 步:廣播到網路(免費)⭐

廣播的本質

將交易發送到區塊鏈網路:

你的錢包
    ↓ (HTTP/WebSocket)
連接到 RPC 節點(如 Infura)
    ↓ (P2P 網路)
節點驗證基本格式
    ↓
轉發給相鄰節點(Gossip Protocol)
    ↓
擴散到整個網路
    ↓
全網所有節點都收到你的交易

時間:1-3 秒
費用:完全免費 ✅
消耗:頻寬(幾百位元組)

為什麼廣播是免費的?

P2P 網路的特性:
├─ 每個節點都幫忙轉發交易
├─ 互惠互利的機制
├─ 你幫我轉發,我也幫你轉發
└─ 維持網路健康

節點轉發的成本:
├─ 幾乎為零(只是轉發數據包)
├─ 幾百位元組的數據
└─ 現代網路頻寬很便宜

第 3 步:進入 Mempool(免費)

Mempool(Memory Pool)= 交易池

Mempool 是什麼:
├─ 記憶體中的待處理交易池
├─ 每個節點都有自己的 Mempool
├─ 存放所有已廣播但未確認的交易
└─ 驗證者從這裡選擇交易打包

Mempool 中的交易:
├─ 按 Gas Price 排序
├─ Gas Price 高的排在前面
├─ 等待被驗證者選中
└─ 可能等待幾秒到幾小時

在 Mempool 等待:
└─ 完全免費 ✅

查看 Mempool

可以在這些地方查看:

Etherscan Pending Transactions:
https://etherscan.io/txsPending

顯示資訊:
├─ 待處理交易數量
├─ Gas Price 分佈
├─ 預估等待時間
└─ 你的交易狀態

第 4 步:驗證者處理(需要 Gas)💰

驗證者的工作流程

驗證者(Validator)的任務:

1️⃣ 從 Mempool 選擇交易
   策略:
   ├─ 優先選擇 Gas Price 高的
   ├─ 確保交易有效
   └─ 打包到 Gas Limit 內

2️⃣ 驗證交易 ⚙️
   檢查:
   ├─ 簽名是否正確(ECDSA 驗證)
   ├─ Nonce 是否正確(防止重放)
   ├─ 餘額是否足夠
   ├─ Gas Fee 是否足夠支付
   └─ 其他協議規則

3️⃣ 執行交易 ⚙️⚙️⚙️
   對於轉 ETH:
   ├─ 扣除發送者餘額
   ├─ 增加接收者餘額
   └─ 更新區塊鏈狀態
   
   對於調用合約(ERC-20):
   ├─ 載入合約程式碼
   ├─ 在 EVM 中執行位元組碼
   ├─ 每個操作都消耗 Gas
   ├─ 更新合約儲存
   └─ 觸發事件

4️⃣ 打包進區塊
   ├─ 計算新的狀態根(State Root)
   ├─ 計算交易根(Transactions Root)
   ├─ 構建區塊頭
   └─ 生成區塊

5️⃣ 獲得獎勵 💰
   └─ 你支付的 Gas Fee
   └─ 這是驗證者的收入來源

這個過程需要真正的算力

消耗的資源:
├─ CPU 算力(驗證簽名、執行程式碼)
├─ 記憶體(載入合約狀態)
├─ 儲存(更新區塊鏈狀態)
└─ 電力(運行伺服器)

這就是為什麼需要 Gas Fee!

第 5 步:區塊確認(免費)

區塊被添加到鏈上

區塊生成後:

1. 廣播到網路
   └─ 其他驗證者接收新區塊

2. 其他驗證者驗證區塊
   └─ 檢查區塊的有效性
   └─ 驗證所有交易

3. 達成共識
   └─ 以太坊 2.0: PoS 共識
   └─ 2/3 驗證者認可

4. 區塊被接受
   └─ 添加到區塊鏈
   └─ 成為永久記錄

5. 後續區塊繼續構建
   └─ 確認數持續增加
   └─ 交易越來越"最終"

費用:對你來說免費 ✅
(Gas Fee 已在第 4 步支付)

轉 ETH vs 轉 USDT 的完整流程對比

轉 1 ETH 的流程

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 1 步:創建交易(本地)
{
    from: 0xYour...,
    to: 0xReceiver...,
    value: 1 ETH,
    gas: 21000,
    gasPrice: 25 Gwei
}
⏱️ 時間:< 1 秒
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 2 步:簽名(本地)
用私鑰簽名交易
⏱️ 時間:< 1 秒
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 3 步:廣播到網路
錢包 → Infura → 全網節點
⏱️ 時間:1-3 秒
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 4 步:進入 Mempool
等待驗證者選擇
⏱️ 時間:0 秒到數分鐘(取決於 Gas Price)
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 5 步:驗證者執行
驗證 → 執行 → 打包
操作:
├─ 你的地址 -1 ETH
└─ 接收者地址 +1 ETH
⏱️ 時間:12 秒(一個區塊時間)
💰 費用:Gas Fee = 21,000 × 25 Gwei = $1.31

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 6 步:確認
區塊被確認,後續區塊繼續
⏱️ 時間:持續
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✅ 總時間:約 15 秒到 5 分鐘
💰 總費用:$1.31

轉 100 USDT 的流程

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 1 步:創建交易(本地)
{
    from: 0xYour...,
    to: 0xdac17f... (USDT 合約地址),
    value: 0 ETH,  ← 注意!不轉 ETH
    data: "transfer(0xReceiver..., 100)",  ← 調用合約函數
    gas: 70000,
    gasPrice: 25 Gwei
}
⏱️ 時間:< 1 秒
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 2 步:簽名(本地)
用私鑰簽名交易
⏱️ 時間:< 1 秒
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 3 步:廣播到網路
錢包 → Infura → 全網節點
⏱️ 時間:1-3 秒
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 4 步:進入 Mempool
等待驗證者選擇
⏱️ 時間:0 秒到數分鐘
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 5 步:驗證者執行
驗證 → 載入 USDT 合約 → 執行程式碼 → 打包
操作:
├─ 調用 USDT.transfer()
├─ 檢查你的 USDT 餘額
├─ balances[你] -= 100
├─ balances[接收者] += 100
├─ 觸發 Transfer 事件
└─ 更新合約儲存
⏱️ 時間:12 秒(一個區塊時間)
💰 費用:Gas Fee = 65,000 × 25 Gwei = $4.06
💡 注意:需要用 ETH 支付 Gas!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

第 6 步:確認
區塊被確認
⏱️ 時間:持續
💰 費用:免費

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✅ 總時間:約 15 秒到 5 分鐘
💰 總費用:$4.06(比轉 ETH 貴 3.1 倍)
⚠️ 前提:錢包裡必須有足夠的 ETH 支付 Gas

Gas 機制詳解

Gas 的核心概念

重要區分:Gas 數量 vs Gas 價格

最終交易費用 = Gas Used × Gas Price

就像加油:
總油費 = 用了幾公公升油 × 每公升多少錢

Gas 的三個關鍵參數

1. Gas Limit(Gas 上限)

定義:
└─ 你願意為這筆交易最多支付多少 Gas

設定:
├─ 轉 ETH:21,000(固定)
├─ 轉 ERC-20:通常 65,000-80,000
├─ 複雜操作:更高
└─ 錢包通常自動估算

如果設定太低:
└─ 💥 交易執行到一半 Gas 用完
└─ ❌ 交易失敗
└─ 😱 已消耗的 Gas 仍然要支付!

如果設定太高:
└─ ✅ 只會用實際需要的量
└─ 💰 多餘的會退回
└─ 但會暫時鎖定更多 ETH

2. Gas Used(實際消耗)

定義:
└─ 交易實際消耗的 Gas 數量

特點:
├─ 轉 ETH:固定 21,000
├─ 轉 ERC-20:約 50,000-80,000(不固定)
├─ 取決於操作的複雜度
└─ 只有執行後才知道確切數量

這是你實際支付的 Gas 數量!

3. Gas Price(單價)

定義:
└─ 每單位 Gas 的價格

單位:Gwei
├─ 1 Gwei = 0.000000001 ETH (10^-9 ETH)
├─ 1 ETH = 1,000,000,000 Gwei

特點:
├─ 根據網路擁堵程度變化
├─ 你可以自己設定
├─ 影響交易被打包的速度
└─ 市場化定價機制

轉 ETH 的 Gas 詳解

Gas Used = 21,000(固定)

為什麼是 21,000?
├─ 以太坊協議規定的
├─ 最基礎的轉帳操作成本
├─ 包括:
│   ├─ 驗證簽名
│   ├─ 檢查餘額
│   ├─ 更新兩個帳戶狀態
│   └─ 記錄交易
└─ 永遠不變!

Gas Price(變動的)

當前市場情況(2024-2025):

網路狀態          Gas Price        交易時間
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🟢 清閒         5-15 Gwei       5-30 分鐘
🟡 正常         15-30 Gwei      1-5 分鐘  
🟠 繁忙         30-50 Gwei      < 1 分鐘
🔴 擁堵         50-100 Gwei     立即
💥 極端擁堵     100-500+ Gwei   爭先恐後

實際費用計算

公式

交易費用 = Gas Used × Gas Price

轉 ETH 的費用 = 21,000 × Gas Price

計算示例

例子 1:網路清閒時

Gas Used: 21,000
Gas Price: 10 Gwei

計算:
21,000 × 10 Gwei = 210,000 Gwei = 0.00021 ETH

如果 ETH = $2,500:
0.00021 × $2,500 = $0.525(約 $0.5)

例子 2:網路正常時

Gas Used: 21,000
Gas Price: 25 Gwei

計算:
21,000 × 25 Gwei = 525,000 Gwei = 0.000525 ETH

如果 ETH = $2,500:
0.000525 × $2,500 = $1.31

例子 3:網路擁堵時

Gas Used: 21,000
Gas Price: 50 Gwei

計算:
21,000 × 50 Gwei = 1,050,000 Gwei = 0.00105 ETH

如果 ETH = $2,500:
0.00105 × $2,500 = $2.63

例子 4:NFT 搶購時(極端)

Gas Used: 21,000
Gas Price: 200 Gwei 😱

計算:
21,000 × 200 Gwei = 4,200,000 Gwei = 0.0042 ETH

如果 ETH = $2,500:
0.0042 × $2,500 = $10.50 😱

不同操作的 Gas 消耗對比

操作類型                    Gas Used        費用(25 Gwei)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
轉 ETH                     21,000          $1.31
轉 ERC-20 (USDT)          ~65,000         $4.06
轉 ERC-20 (USDC)          ~52,000         $3.25
授權 ERC-20 (Approve)     ~46,000         $2.88
Uniswap 簡單交換          ~150,000        $9.38
OpenSea 購買 NFT          ~200,000        $12.50
複雜 DeFi 操作            ~300,000        $18.75
Uniswap 添加流動性        ~250,000        $15.63
部署簡單智能合約          ~1,000,000      $62.50
部署複雜合約              ~3,000,000+     $187.50+

為什麼差異這麼大?

轉 ETH (21,000):
└─ 最簡單:直接修改兩個帳戶餘額

轉 ERC-20 (65,000):
├─ 需要調用智能合約
├─ 執行合約程式碼
├─ 更新合約儲存
└─ 觸發事件

Uniswap 交換 (150,000):
├─ 調用 DEX 合約
├─ 涉及多個代幣合約
├─ 計算兌換比例
├─ 更新流動性池
├─ 多次代幣轉移
└─ 複雜的數學計算

EIP-1559 Gas 機制

2021 年 8 月引入的新機制

舊機制(之前):

Gas Fee = Gas Price × Gas Used

問題:
├─ 容易出現嚴重擁堵
├─ Gas Price 波動劇烈
└─ 難以估算費用

新機制(EIP-1559):

Gas Fee = (Base Fee + Priority Fee) × Gas Used

Base Fee(基礎費用):
├─ 由協議自動調整
├─ 根據上一個區塊的使用率
├─ 區塊滿 → Base Fee 上公升
├─ 區塊空 → Base Fee 下降
├─ 會被銷毀(通縮機制)🔥
└─ 你無法控制,只能接受

Priority Fee(小費/優先費):
├─ 你可以設定
├─ 支付給驗證者的獎勵
├─ 越高越快被打包
└─ 通常 1-3 Gwei 就夠

MetaMask 中的 EIP-1559 設定

⚙️ 進階 Gas 控制

Max Base Fee: 25 Gwei
├─ 你願意支付的最高基礎費用
└─ 如果實際 Base Fee 超過,交易等待

Max Priority Fee: 2 Gwei
├─ 給驗證者的小費
└─ 激勵他們優先處理你的交易

Max Fee: 27 Gwei
├─ = Max Base Fee + Max Priority Fee
└─ 你最多支付的總費用

實際支付:
└─ 通常比 Max Fee 低
└─ 因為實際 Base Fee 可能較低
└─ 只支付 (實際 Base Fee + Priority Fee)

省 Gas 的實用技巧

1. 選擇合適的時間 ⏰

📊 一週中的 Gas Price 模式:

最便宜時段:
├─ 週末(週六、週日)
├─ UTC 時間 00:00-08:00(亞洲白天,美國深夜)
└─ 節假日

最貴時段:
├─ 週二到週四(工作日)
├─ UTC 時間 14:00-22:00(美國上班時間)
└─ 重大 NFT 發售、空投時

建議:
└─ 不急的轉帳選擇便宜時段
└─ 可以省 50-70% 的 Gas

2. 設定合理的 Gas Price

策略:
├─ 不急:設定較低的 Gas Price
│   └─ 可能等幾小時到一天
│   └─ 省 50-80% 費用
│
├─ 正常:使用錢包推薦的"標準"
│   └─ 通常 1-5 分鐘確認
│
└─ 很急:使用"快速"或"激進"
    └─ 30 秒到 1 分鐘確認
    └─ 貴 50-100%

3. 使用 Layer 2 ⚡

Layer 2 的 Gas 費用對比:

以太坊主網:
├─ 轉 ETH: $1-10
└─ 轉 USDT: $3-20

Arbitrum:
├─ 轉 ETH: $0.10-0.50   ↓ 便宜 10-20 倍
└─ 轉 USDT: $0.20-1.00  ↓

Optimism:
├─ 轉 ETH: $0.10-0.50   ↓ 便宜 10-20 倍
└─ 轉 USDT: $0.20-1.00  ↓

Base (Coinbase L2):
├─ 轉 ETH: $0.05-0.20   ↓ 便宜 20-50 倍
└─ 轉 USDT: $0.10-0.50  ↓

優勢:
✅ 速度快(1-2 秒確認)
✅ 費用低(便宜 10-100 倍)
✅ 與主網資產可以跨鏈

4. 批量操作

❌ 不好的做法:
分 10 次轉帳,每次轉 0.1 ETH
Gas Fee: $1.31 × 10 = $13.10

✅ 好的做法:
一次轉 1 ETH
Gas Fee: $1.31(只付一次)

節省:$11.79!

批量轉帳工具:
├─ Disperse.app(批量轉帳)
├─ Multisender(批量發送代幣)
└─ 一次交易轉給多個地址

5. 選擇低 Gas 的代幣

如果經常使用穩定幣:

USDC (~52,000 gas)  ✅ 比 USDT 便宜 20%
DAI (~56,000 gas)   ✅ 比 USDT 便宜 14%  
USDT (~65,000 gas)  ❌ 相對較貴

但要考慮:
├─ 流動性(USDT 通常最好)
├─ 接受度(USDT 最廣泛)
└─ 省的 Gas 是否值得兌換

6. 使用其他鏈的版本

USDT 有多個鏈的版本:

ERC-20 (以太坊):    $3-10 Gas
TRC-20 (Tron):      ~$1 Gas      ✅ 便宜 5-10 倍
BEP-20 (BSC):       ~$0.20 Gas   ✅ 便宜 15-50 倍

注意事項:
⚠️ 確保接收方支持該鏈
⚠️ 不同鏈的 USDT 不能直接互相轉帳
⚠️ 需要通過跨鏈橋轉換

即時 Gas Price 查詢工具

推薦工具

1. Etherscan Gas Tracker

網址:https://etherscan.io/gastracker

顯示資訊:
├─ 當前 Base Fee
├─ 低/標準/高/激進 Gas Price
├─ 歷史趨勢圖(24h/7天)
├─ 不同操作的預估費用
└─ 預估確認時間

2. ETH Gas Station

網址:https://ethgasstation.info/

顯示資訊:
├─ 安全低價(~10 分鐘)
├─ 標準價格(~3 分鐘)
├─ 快速價格(~1 分鐘)
└─ 最快價格(~30 秒)

3. Blocknative Gas Estimator

網址:https://www.blocknative.com/gas-estimator

特點:
├─ 即時更新
├─ 顯示機率分佈
├─ 置信度顯示
└─ 精確預測

廣播機制解析

廣播的本質

核心概念:廣播本身不需要 Gas ❌

廣播交易 = 免費的網路傳播 ✅
執行交易 = 需要 Gas 的算力消耗 💰

廣播不需要 Gas 的原因

1. 廣播只是數據傳輸

廣播過程:
├─ 發送簽名後的交易數據(~200 位元組)
├─ P2P 網路中的消息傳遞
├─ 類似於發送電子郵件
└─ 不涉及複雜計算

消耗資源:
├─ 頻寬(幾百位元組)
└─ 極少量的網路資源

不消耗:
└─ 算力(幾乎可以忽略)

2. P2P 網路的互惠機制

每個節點都:
├─ 轉發自己收到的交易
├─ 也接收其他節點轉發的交易
└─ 互惠互利,維持網路健康

節點轉發的成本:
├─ 幾乎為零
├─ 現代頻寬很便宜
└─ 轉發幾百位元組的數據無關緊要

廣播的詳細流程

Gossip Protocol(八卦協議)

交易如何在網路中擴散:

你的錢包發送交易
    ↓
連接到 1 個 RPC 節點(如 Infura)
    ↓
該節點驗證基本格式
    ↓
轉發給 8-12 個相鄰節點
    ↓
每個節點又轉發給各自的相鄰節點
    ↓
呈指數級擴散
    ↓
2-3 秒內傳遍全網(數千個節點)

就像謠言傳播:
└─ 一傳十,十傳百
└─ 很快全校都知道了

節點驗證

節點收到交易後的簡單檢查:
├─ 格式是否正確
├─ 簽名是否有效(輕量驗證)
├─ 基本參數是否合理
└─ 不在重複交易列表中

✅ 通過 → 轉發給鄰居
❌ 不通過 → 丟棄

這些檢查很輕量:
└─ 不執行交易
└─ 不更新狀態
└─ 只是基本驗證

Gas 支付的是什麼?

Gas 不支付廣播

❌ Gas 不是用來支付:
├─ 廣播交易到網路(免費)
├─ 在 Mempool 中等待(免費)
├─ 數據傳輸和儲存(免費)
└─ 網路頻寬(免費)

Gas 支付算力和儲存

✅ Gas 是用來支付:
├─ 驗證交易的算力(簽名驗證)
├─ 執行交易的算力(狀態變更)
├─ 運行智能合約的算力(EVM 執行)
├─ 更新區塊鏈狀態的儲存
├─ 打包進區塊的工作
└─ 驗證者的時間和資源

形象比喻

交易 = 去醫院看病

1️⃣ 掛號(廣播交易)
   └─ 免費 ✅
   └─ 只是登記你要看病
   └─ 告訴醫院你來了

2️⃣ 等待叫號(在 Mempool)
   └─ 免費 ✅
   └─ 坐在候診室等待
   └─ VIP(高 Gas)先被叫

3️⃣ 醫生看診(執行交易)
   └─ 收費 💰
   └─ 醫生的專業服務需要付費
   └─ 這就是 Gas Fee

4️⃣ 拿到診斷書(交易確認)
   └─ 免費 ✅
   └─ 已包含在看診費用中

廣播算是算力嗎?

短答案:不算真正的算力

廣播 ≠ 算力密集型操作

廣播只是:
├─ 網路傳輸(頻寬)
├─ 簡單的數據驗證
└─ P2P 消息傳遞

不是:
├─ 複雜的密碼學計算
├─ 智能合約執行
└─ 狀態樹更新

算力消耗對比

操作類型                  算力消耗          費用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
創建交易(本地)          極低              免費
簽名交易(本地)          低                免費
廣播交易(網路)          極低(頻寬)      免費
在 Mempool 等待          無                免費
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
驗證簽名                 中等              ↓
執行 EVM 程式碼            高                ↓ 這些需要 Gas
更新狀態樹               高                ↓
計算新狀態根             中等              ↓
打包進區塊               中等              ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
區塊確認                 中等(共識)      免費

為什麼沒有 Gas 網路會崩潰?

沒有 Gas 的災難場景

假設廣播和執行都不需要 Gas:

💥 問題 1:垃圾交易攻擊
├─ 攻擊者瘋狂發送無效交易
├─ 每秒發送百萬筆交易
├─ 免費的話成本為零
├─ Mempool 被充滿
└─ 正常交易無法被處理

💥 問題 2:驗證者沒有動力
├─ 驗證和執行交易消耗資源
├─ 伺服器、電力、頻寬都要錢
├─ 沒有報酬誰願意做?
└─ 網路停止運作

💥 問題 3:資源耗盡
├─ 有人執行無限迴圈合約
├─ 消耗所有驗證者的 CPU
├─ 區塊鏈無法繼續
└─ 系統崩潰

Gas 機制的重要性

✅ 防止濫用:
└─ 每個操作都要付費
└─ 攻擊成本很高

✅ 激勵驗證者:
└─ 提供算力有報酬
└─ 維持網路健康運行

✅ 資源分配:
└─ 市場化機制
└─ 誰願意付更多,誰優先處理

✅ 防止無限迴圈:
└─ Gas Limit 限制
└─ 防止惡意程式碼耗盡資源

智能合約與 DApp

什麼是智能合約?

定義

智能合約(Smart Contract):
├─ 部署在區塊鏈上的程式程式碼
├─ 自動執行的合約
├─ 不需要中介
└─ 程式碼即法律(Code is Law)

特點

✅ 自動執行:
└─ 條件滿足自動觸發
└─ 不需要人工幹預

✅ 不可篡改:
└─ 部署後無法修改
└─ 程式碼公開透明

✅ 去中心化:
└─ 運行在區塊鏈上
└─ 不受單一實體控制

✅ 可驗證:
└─ 任何人都可以查看程式碼
└─ 結果可預測

ERC-20 代幣就是智能合約

USDT 合約示例

// USDT 智能合約的簡化版本

contract TetherToken {
    // 代幣名稱
    string public name = "Tether USD";
    string public symbol = "USDT";
    uint8 public decimals = 6;
    
    // 總供應量
    uint256 public totalSupply;
    
    // 餘額映射:地址 => 餘額
    mapping(address => uint256) public balances;
    
    // 授權映射:地址 => (被授權地址 => 額度)
    mapping(address => mapping(address => uint256)) public allowed;
    
    // 轉帳函數
    function transfer(address to, uint256 value) public returns (bool) {
        require(balances[msg.sender] >= value, "餘額不足");
        require(to != address(0), "無效地址");
        
        balances[msg.sender] -= value;
        balances[to] += value;
        
        emit Transfer(msg.sender, to, value);
        return true;
    }
    
    // 查詢餘額
    function balanceOf(address owner) public view returns (uint256) {
        return balances[owner];
    }
    
    // 授權函數
    function approve(address spender, uint256 value) public returns (bool) {
        allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }
    
    // 代理轉帳
    function transferFrom(address from, address to, uint256 value) 
        public returns (bool) {
        require(balances[from] >= value, "餘額不足");
        require(allowed[from][msg.sender] >= value, "授權額度不足");
        
        balances[from] -= value;
        balances[to] += value;
        allowed[from][msg.sender] -= value;
        
        emit Transfer(from, to, value);
        return true;
    }
}

合約地址

USDT 在以太坊主網的合約地址:
0xdac17f958d2ee523a2206206994597c13d831ec7

這個地址:
├─ 是合約的"家"
├─ 儲存合約程式碼
├─ 儲存合約狀態(所有餘額)
└─ 接收和處理交易

DApp(去中心化應用)也是智能合約

DApp 的構成

DApp = 前端介面 + 智能合約

前端(用戶看到的):
├─ 網頁介面(HTML/CSS/JavaScript)
├─ 讓用戶輸入和互動
└─ 連接錢包(MetaMask)

智能合約(後端邏輯):
├─ 部署在區塊鏈上
├─ 處理業務邏輯
├─ 儲存數據
└─ 執行操作

常見的 DApp 例子

1. Uniswap(去中心化交易所)

Uniswap 是什麼:
├─ 一組智能合約
├─ 實現自動做市商(AMM)
├─ 允許用戶兌換代幣
└─ 不需要中心化交易所

核心合約:
├─ Router 合約(路由交易)
├─ Factory 合約(創建交易對)
├─ Pair 合約(流動性池)
└─ 每個都是獨立的智能合約

用戶操作時:
└─ 前端介面連接錢包
└─ 調用 Uniswap 智能合約
└─ 合約自動執行兌換
└─ 支付 Gas Fee

2. Aave(借貸協議)

Aave 是什麼:
├─ 去中心化借貸平臺
├─ 完全由智能合約運行
├─ 自動計算利率
└─ 無需人工審批

核心功能都是智能合約:
├─ 存款合約
├─ 借款合約
├─ 清算合約
└─ 治理合約

工作原理:
└─ 用戶存入資產(調用合約)
└─ 獲得利息(合約自動計算)
└─ 可以借款(合約檢查抵押率)
└─ 一切自動化

3. OpenSea(NFT 市場)

OpenSea 的智能合約:
├─ NFT 合約(ERC-721/ERC-1155)
├─ 市場合約(處理買賣)
├─ 拍賣合約(競價機制)
└─ 版稅合約(創作者分成)

購買 NFT 時:
└─ 前端顯示 NFT
└─ 用戶點擊購買
└─ 調用市場合約
└─ 合約轉移 NFT 所有權
└─ 自動分配款項

4. ENS(以太坊網域服務)

ENS 智能合約:
├─ 註冊器合約(註冊網域)
├─ 解析器合約(解析地址)
├─ 反向解析合約
└─ 控制器合約

功能:
└─ alice.eth → 0x1234...
└─ 將人類可讀的名稱映射到地址
└─ 完全去中心化
└─ 由智能合約管理

與智能合約互動

讀取數據(免費)

查詢操作(不修改狀態):
├─ 查詢餘額:balanceOf()
├─ 查詢價格:getPrice()
├─ 查詢總供應:totalSupply()
└─ 查詢任何公開數據

特點:
├─ 完全免費 ✅
├─ 不需要 Gas
├─ 不需要簽名
└─ 即時返回結果

原因:
└─ 只是讀取區塊鏈狀態
└─ 不改變任何東西
└─ 在本地節點執行
// 讀取 USDT 餘額(免費)
const balance = await usdtContract.methods
    .balanceOf("0xYourAddress")
    .call();  // .call() 表示只讀取,不修改

console.log(`餘額: ${balance}`);
// 完全免費,不需要 Gas

寫入數據(需要 Gas)

修改操作(改變狀態):
├─ 轉帳:transfer()
├─ 授權:approve()
├─ 交易:swap()
└─ 任何改變區塊鏈狀態的操作

特點:
├─ 需要支付 Gas 💰
├─ 需要簽名(證明授權)
├─ 需要等待確認
└─ 會改變區塊鏈狀態

原因:
└─ 需要驗證者執行
└─ 需要更新區塊鏈狀態
└─ 消耗算力和儲存
// 轉帳 USDT(需要 Gas)
await usdtContract.methods
    .transfer("0xReceiverAddress", 100000000)  // 100 USDT
    .send({
        from: "0xYourAddress",
        gas: 70000,
        gasPrice: web3.utils.toWei('25', 'gwei')
    });

// 需要支付約 $4 的 Gas Fee

智能合約的 Gas 消耗

不同操作的 Gas 成本

EVM 操作碼的 Gas 成本(部分):

基礎操作:
├─ ADD(加法)          3 gas
├─ MUL(乘法)          5 gas
├─ DIV(除法)          5 gas
└─ JUMP(跳轉)         8 gas

儲存操作:
├─ SLOAD(讀取)        2,100 gas
├─ SSTORE(首次寫入)   20,000 gas
└─ SSTORE(修改)       5,000 gas

合約調用:
├─ CALL(調用合約)     700+ gas
└─ CREATE(創建合約)   32,000+ gas

為什麼差異大:
└─ 儲存是永久的,成本高
└─ 計算是臨時的,成本低
└─ 這就是為什麼複雜合約貴

最佳化 Gas 的程式設計技巧

❌ Gas 浪費的寫法:
for (uint i = 0; i < users.length; i++) {
    // 每次迴圈都讀取 storage
    totalBalance += balances[users[i]];
}

✅ Gas 最佳化的寫法:
uint256 total = 0;
uint256 length = users.length;  // 快取長度
for (uint i = 0; i < length; i++) {
    total += balances[users[i]];
}
totalBalance = total;  // 只寫一次 storage

節省的 Gas:
└─ 每次迴圈節省 2,100 gas(SLOAD)
└─ 100 個用戶可節省 210,000 gas
└─ 約 $13 (25 Gwei)

安全性考慮

智能合約的風險

⚠️ 不可篡改 = 雙面刃:
├─ ✅ 好處:規則透明,不能作弊
└─ ❌ 壞處:有 Bug 也無法修復

歷史慘案:
├─ The DAO 事件(2016)
│   └─ 漏洞被利用,損失 $50M+
│
├─ Parity 錢包(2017)
│   └─ 合約 Bug,鎖死 $150M+
│
└─ Poly Network(2021)
    └─ 跨鏈橋漏洞,被盜 $600M+

使用 DApp 的安全建議

✅ 檢查合約地址:
└─ 從官方網站獲取
└─ 在 Etherscan 驗證
└─ 防止釣魚網站

✅ 查看合約稽核:
└─ 是否經過專業稽核
└─ 稽核報告內容
└─ 已知問題

✅ 限制授權額度:
└─ 不要無限授權(Unlimited Approval)
└─ 只授權需要的數量
└─ 定期檢查和撤銷授權

✅ 使用專門的 DeFi 錢包:
└─ 大額資產不連接 DApp
└─ 小額資金專門用於互動
└─ 定期轉出收益到冷錢包

實戰案例

案例 1:第一次轉 ETH

場景設定

你的錢包:
├─ ETH: 2.5 ETH
└─ 地址: 0xABC...

朋友的地址:0xDEF...

目標:轉 1 ETH 給朋友

詳細步驟

第 1 步:檢查 Gas Price
├─ 訪問 Etherscan Gas Tracker
├─ 當前顯示:
│   ├─ 慢速:10 Gwei (~10 分鐘)
│   ├─ 標準:20 Gwei (~3 分鐘)
│   └─ 快速:30 Gwei (~1 分鐘)
└─ 選擇:標準(20 Gwei)

第 2 步:在 MetaMask 創建交易
├─ 點擊「發送」
├─ 輸入朋友地址:0xDEF...
├─ 輸入金額:1 ETH
└─ 查看預估費用

┌─────────────────────────────┐
│ 正在發送                     │
│                              │
│ 金額: 1 ETH                 │
│ 接收: 0xDEF...              │
│                              │
│ Gas 費用預估:               │
│ 🚶 標準: $1.05 (~3 分鐘)   │
│                              │
│ 總計: 1.00042 ETH           │
│       ($2,501.05)            │
└─────────────────────────────┘

第 3 步:確認交易
├─ 仔細檢查地址
├─ 確認金額
├─ 點擊「確認」
└─ 輸入錢包密碼(如需要)

第 4 步:等待確認
├─ 交易雜湊:0x1234567...
├─ 狀態:Pending(待確認)
├─ 在 Etherscan 查看進度
└─ 約 2-3 分鐘後確認

第 5 步:完成 ✅
├─ 狀態:Success
├─ 你的餘額:1.49958 ETH
│   └─ 2.5 - 1 - 0.00042 = 1.49958
└─ 朋友收到:1 ETH

案例 2:轉 USDT 遇到問題

場景設定

你的錢包:
├─ ETH: 0 ETH  ⚠️
├─ USDT: 1,000 USDT
└─ 想轉 100 USDT 給朋友

遇到的問題

第 1 步:嘗試轉帳
├─ 在 MetaMask 選擇 USDT
├─ 輸入朋友地址
├─ 輸入 100 USDT
└─ 點擊「下一步」

第 2 步:錯誤提示 ❌
┌─────────────────────────────┐
│ ⚠️ 錯誤                     │
│                              │
│ 餘額不足以支付 Gas Fee      │
│                              │
│ 需要: 0.00165 ETH           │
│ 當前: 0 ETH                 │
│                              │
│ 請先充值 ETH                │
└─────────────────────────────┘

問題原因:
└─ 轉 USDT 需要調用智能合約
└─ 需要用 ETH 支付 Gas Fee
└─ 但錢包裡沒有 ETH!

解決方案

方案 A:從交易所提現 ETH
├─ 去 Binance/Coinbase
├─ 提現 0.02 ETH(約 $50)到錢包
├─ 等待到帳(5-15 分鐘)
└─ 足夠支付很多次 Gas

方案 B:請朋友轉一點 ETH
├─ 請朋友轉 0.01 ETH
├─ 收到後立即可以轉 USDT
└─ 之後可以還給朋友

方案 C:使用交易所內轉帳
├─ 如果朋友也在同一交易所
├─ 直接在交易所內轉帳
└─ 免 Gas Fee

推薦:方案 A
└─ 以後持續有 ETH
└─ 隨時可以轉代幣

案例 3:使用 Uniswap 交換代幣

場景設定

你想把 1,000 USDT 換成 ETH

你的錢包:
├─ ETH: 0.05 ETH(用於 Gas)
└─ USDT: 1,000 USDT

詳細流程

第 1 步:訪問 Uniswap
├─ https://app.uniswap.org
├─ 連接 MetaMask 錢包
└─ 確認連接

第 2 步:首次使用需要授權
┌─────────────────────────────┐
│ 授權 USDT                   │
│                              │
│ Uniswap 需要訪問你的 USDT  │
│                              │
│ 授權金額:                   │
│ ○ 精確金額: 1,000 USDT     │
│ ● 無限額度(推薦)          │
│                              │
│ Gas Fee: $2.88              │
└─────────────────────────────┘

點擊「授權」:
├─ 這是一筆單獨的交易
├─ 需要支付 Gas(~$2.88)
├─ 等待確認(1-3 分鐘)
└─ 授權完成後才能交換

第 3 步:執行交換
┌─────────────────────────────┐
│ 交換                         │
│                              │
│ 賣出: 1,000 USDT            │
│ 買入: ~0.396 ETH            │
│                              │
│ 匯率: 1 ETH = 2,525 USDT   │
│ 滑點: 0.5%                  │
│ Gas Fee: $9.38              │
│                              │
│ 總計: 1,000 USDT → 0.396 ETH│
└─────────────────────────────┘

點擊「交換」:
├─ 需要再支付一次 Gas
├─ 等待確認
└─ 完成!

第 4 步:結果
你的錢包現在:
├─ ETH: 0.05 + 0.396 - 0.00234 - 0.00588 
│      = 0.43778 ETH
└─ USDT: 0 USDT

總成本:
├─ 授權 Gas: $2.88
├─ 交換 Gas: $9.38
├─ Uniswap 手續費: 0.3% of 1,000 = $3
└─ 總計: $15.26

省錢技巧

✅ 使用 Layer 2 版本:
├─ Uniswap 在 Arbitrum
├─ Gas Fee: $0.50(便宜 18 倍!)
├─ 手續費還是 0.3%
└─ 需要先把資產跨鏈到 Arbitrum

✅ 選擇合適時間:
├─ 週末 Gas 便宜 30-50%
└─ 美國深夜(亞洲白天)

✅ 大額交換更劃算:
├─ Gas Fee 是固定的
├─ 換 $10,000 還是 $9.38
└─ 比例上更便宜

案例 4:購買 NFT

場景設定

在 OpenSea 購買一個 NFT
價格:0.5 ETH

你的錢包:
├─ ETH: 1 ETH
└─ 足夠購買和支付 Gas

購買流程

第 1 步:連接錢包
├─ 訪問 OpenSea
├─ 連接 MetaMask
└─ 瀏覽 NFT

第 2 步:點擊購買
┌─────────────────────────────┐
│ Complete Checkout            │
│                              │
│ Item: Bored Ape #1234       │
│ Price: 0.5 ETH              │
│                              │
│ Fees:                        │
│ ├─ Creator Fee: 0.025 ETH   │
│ └─ OpenSea Fee: 0.0125 ETH  │
│                              │
│ Gas Fee: $12.50             │
│                              │
│ Total: 0.5375 ETH + Gas     │
└─────────────────────────────┘

第 3 步:確認交易
├─ MetaMask 彈出確認
├─ 顯示詳細交易資訊
├─ 檢查合約地址
└─ 點擊確認

第 4 步:等待確認
├─ 交易雜湊:0xabcd...
├─ 狀態:Pending
├─ 約 1-2 分鐘
└─ 確認後 NFT 到帳

第 5 步:驗證所有權
├─ 在 OpenSea 查看你的收藏
├─ 在 Etherscan 查看 NFT 轉移記錄
└─ NFT 現在屬於你 ✅

常見問題

Q1: 為什麼我的交易一直 Pending?

可能原因:

1️⃣ Gas Price 設太低
   └─ 驗證者優先處理 Gas 高的交易
   └─ 你的交易在佇列後面

2️⃣ 網路特別擁堵
   └─ 大量交易同時發生
   └─ 需要等待或提高 Gas

3️⃣ Nonce 問題
   └─ 前一筆交易還在 Pending
   └─ 後面的交易都會等待

解決方法:
├─ 加速交易(Speed Up)
│   └─ MetaMask 有此功能
│   └─ 用更高 Gas 重發
│
├─ 取消交易(Cancel)
│   └─ 發送 0 ETH 給自己
│   └─ 使用相同 Nonce
│   └─ 設定更高 Gas
│
└─ 等待
    └─ 24-48 小時後通常會被丟棄

Q2: 交易失敗了,Gas Fee 還會扣嗎?

😱 會的!

原因:
├─ 驗證者已經處理了你的交易
├─ 執行到一半失敗
├─ 消耗的算力是真實的
└─ Gas Fee 是支付算力的費用

常見失敗原因:
├─ Out of Gas(Gas Limit 設太低)
├─ 合約執行錯誤(如餘額不足)
├─ 滑點過大(DEX 交易)
└─ 合約被暫停

如何避免:
├─ 不要隨意修改 Gas Limit
├─ 使用錢包的模擬功能
├─ 設定合理的滑點
└─ 確保有足夠餘額

Q3: 為什麼轉 USDT 比轉 ETH 貴這麼多?

差異對比:
├─ 轉 ETH: $1-3
└─ 轉 USDT: $3-10

原因:
├─ ETH 是原生資產,簡單直接
│   └─ Gas: 21,000
│
└─ USDT 是智能合約,複雜
    ├─ 需要調用合約
    ├─ 執行合約程式碼
    ├─ 更新合約儲存
    ├─ 觸發事件
    └─ Gas: ~65,000(3 倍)

省錢方法:
├─ 使用 Layer 2(Arbitrum、Optimism)
├─ 使用其他鏈(Tron、BSC)
├─ 選擇 Gas 便宜的時間
└─ 批量轉帳

Q4: 什麼時候 Gas 最便宜?

📊 Gas Price 模式:

一天中:
├─ 最便宜:UTC 0:00-8:00(亞洲白天)
├─ 正常:UTC 8:00-14:00
├─ 最貴:UTC 14:00-22:00(美國上班時間)
└─ 較貴:UTC 22:00-24:00

一週中:
├─ 最便宜:週末(週六、週日)
├─ 正常:週一、週五
└─ 最貴:週二到週四

特殊事件:
├─ NFT 發售時:💥 極貴
├─ 空投時:💥 極貴
├─ 節假日:✅ 便宜
└─ 市場崩盤時:💥 極貴(恐慌性交易)

建議:
└─ 不急的操作選週末亞洲時間
└─ 可以省 50-70% Gas

Q5: 能不能不付 Gas Fee?

在以太坊主網:❌ 不可能

所有改變狀態的操作都需要 Gas:
├─ 轉 ETH
├─ 轉 ERC-20
├─ 與合約互動
├─ 部署合約
└─ 任何寫入操作

為什麼必須有 Gas:
├─ 防止垃圾交易攻擊
├─ 激勵驗證者
├─ 資源分配機制
└─ 維持網路運行

替代方案:
✅ 使用 Layer 2(費用低 10-100 倍)
│   ├─ Arbitrum
│   ├─ Optimism
│   ├─ Base
│   └─ zkSync
│
✅ 使用其他低費用鏈
│   ├─ BSC (Binance Smart Chain)
│   ├─ Polygon
│   └─ Tron
│
✅ 等網路清閒時操作
    └─ 費用可以低 50-70%

Q6: 交易卡住了怎麼辦?

情況:交易已經 Pending 很久

方法 A:加速交易(Speed Up)
├─ MetaMask 點擊交易
├─ 選擇「Speed Up」
├─ 設定更高的 Gas Price
├─ 確認新交易
└─ 舊交易會被替代

方法 B:取消交易(Cancel)
├─ MetaMask 點擊交易
├─ 選擇「Cancel」
├─ 實際是發送 0 ETH 給自己
├─ 使用相同的 Nonce
├─ 設定更高的 Gas Price
└─ 原交易會被取代

方法 C:等待
├─ 交易會在 Mempool 中
├─ 24-48 小時後通常被丟棄
└─ 不消耗任何 Gas

注意:
⚠️ 加速和取消都需要支付新的 Gas Fee

Q7: Gas Limit 應該設多少?

常見操作的 Gas Limit:

轉 ETH:
└─ 21,000(固定,不要改)

轉 ERC-20:
└─ 65,000-80,000(讓錢包自動估算)

Uniswap 交換:
└─ 150,000-200,000

複雜 DeFi:
└─ 300,000-500,000

部署合約:
└─ 1,000,000+

原則:
✅ 使用錢包的自動估算
✅ 或在估算基礎上加 10-20% 餘量
❌ 不要隨意修改
❌ 設太低會導致失敗但仍扣 Gas

Q8: 如何查看交易詳情?

使用 Etherscan:

1. 複製交易雜湊
   └─ 在錢包裡找到交易
   └─ 複製 Transaction Hash

2. 訪問 Etherscan
   └─ https://etherscan.io
   └─ 搜尋列輸入交易雜湊

3. 查看詳細資訊
   ├─ 狀態(Success/Fail/Pending)
   ├─ 區塊號
   ├─ 時間戳
   ├─ From 地址
   ├─ To 地址
   ├─ 金額
   ├─ Gas Used
   ├─ Gas Price
   ├─ Transaction Fee
   └─ Input Data(如果有)

4. 如果是代幣轉帳
   └─ 查看「Token Transfer」標籤
   └─ 看到實際轉移的代幣

總結

🎯 核心要點

ETH vs ERC-20

ETH:
├─ 區塊鏈原生資產
├─ 用於支付 Gas
├─ 轉帳 Gas: 21,000(固定)
└─ 簡單直接

ERC-20:
├─ 智能合約代幣
├─ 不能支付 Gas
├─ 轉帳 Gas: 50,000-80,000
├─ 需要 ETH 支付 Gas
└─ 複雜但靈活

交易流程

創建 → 簽名 → 廣播 → Mempool → 執行 → 確認
  ↓      ↓      ↓       ↓        ↓      ↓
免費   免費   免費    免費     💰 Gas  免費

Gas 機制

交易費用 = Gas Used × Gas Price

Gas Used:
├─ 取決於操作複雜度
└─ 轉 ETH: 21,000

Gas Price:
├─ 取決於網路擁堵
└─ 5-100+ Gwei

總費用:
└─ $0.5-$50+

智能合約

DApp = 前端 + 智能合約

特點:
├─ 自動執行
├─ 不可篡改
├─ 去中心化
└─ 需要 Gas

💡 實用建議

  1. 永遠保留一些 ETH - 至少 $20-50 用於 Gas
  2. 選擇合適時間 - 週末亞洲時間最便宜
  3. 使用 Layer 2 - 費用低 10-100 倍
  4. 小額測試 - 第一次操作先小額測試
  5. 檢查合約 - 使用 DApp 前驗證合約地址
  6. 限制授權 - 不要無限授權代幣
  7. 監控 Gas - 使用 Gas Tracker 工具

免責聲明: 本文件僅供教育和資訊目的,不構成投資建議。使用智能合約和 DeFi 協議存在風險,請自行做好研究並承擔相應風險。

最後更新: 2024 年 11 月


補充資源:

  • Etherscan Gas Tracker: https://etherscan.io/gastracker
  • Ethereum.org 文件: https://ethereum.org/developers
  • Uniswap 文件: https://docs.uniswap.org
  • OpenZeppelin 合約庫: https://docs.openzeppelin.com

如果這份指南對你有幫助,歡迎分享! 🚀