以太坊交易機制完全指南
目錄
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 Transfer | Contract 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
💡 實用建議
- 永遠保留一些 ETH - 至少 $20-50 用於 Gas
- 選擇合適時間 - 週末亞洲時間最便宜
- 使用 Layer 2 - 費用低 10-100 倍
- 小額測試 - 第一次操作先小額測試
- 檢查合約 - 使用 DApp 前驗證合約地址
- 限制授權 - 不要無限授權代幣
- 監控 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
如果這份指南對你有幫助,歡迎分享! 🚀