解碼智能合約錢包交易
用智能合約錢包(SCW)做換幣,流程同傳統 Ethereum/EVM 錢包好唔同。呢個分別有時會令人迷惘,特別係出事嗰陣。但只要你明白流程入面嘅關鍵角色——同點樣一步步喺 app 同區塊瀏覽器讀到發生咩事——一切就會開始合理。
一齊行一轉啦。
由一下手指到上鏈執行:其實發生咗乜
你喺 app 撳「Swap」個刻,好似只係一個動作。其實你係啟動緊一個建基於 Ethereum 帳戶抽象(ERC-4337)之上的多層流程。你嘅交易唔會似一般錢包咁直入區塊鏈,反而會兜個圈:
我哋砌路線。我哋問路由引擎(例如 1inch)幫你搵最佳路徑,並做模擬確保可行。我哋估 gas、核對你有冇足夠代幣,然後將指令打包成一個特別格式:一個
UserOperation(用戶操作)
.有個
bundler(打包者)
出場。呢個係鏈下角色,負責將 UserOperation 提交去區塊鏈。佢會檢查你嘅 op、確保有效,並幫你預付 gas(之後會攞回)。你嘅 UserOp 會經由
EntryPoint
智能合約進入區塊鏈。可以將 EntryPoint 當係所有 SCW 交易必經嘅閘口。EntryPoint 做最後檢查,如果一切 OK…EntryPoint 叫你嘅智能合約錢包(SCW)去執行換幣。你嘅 SCW call 路由器(例如 1inch),路由器再 call liquidity pools,代幣移動,最後輸出返落你嘅錢包。
總結:你撳 swap → 我哋模擬 → bundler 提交 → EntryPoint 驗證 → 你嘅 SCW 執行。
睇個真實例子
而家明咗高層流程,睇下真實換幣點走:先喺 app 入面,之後上鏈:
我哋見到:
我哋用 1 USDC 換到 0.765 KTA。
換幣喺 Base 上執行(留意幣種符號上嘅 Base 圖示)。
我哋支付咗:
$0.03 gas(以 ETH 計)
0.22% 換幣費俾 goodcryptoX
0.05% 路由費俾 1inch
路線好簡單:100% 經 Uniswap v4 池。
Bundler:Alchemy(見上面第 2 步回顧)
如果交易已經上到鏈並記錄喺區塊(就算失敗),就會顯示區塊瀏覽器連結
到目前為止一切正常。下一步,撳 BaseScan 連結睇下呢單交易喺鏈上點樣:
From: 呢個唔係你嘅錢包——係 Alchemy 嘅 bundler。合理,因為係 bundler 提交咗交易。
To: EntryPoint(v0.6.0)。再一次,合理——所有 SCW 交易都係由呢度入。
Internal Transactions: 顯示交易入面原生代幣(喺 Base 上係 ETH)嘅流向。以下係我哋見到嘅:
我哋個錢包(…0A5)畀咗 ETH 去 EntryPoint 作為 gas 費。
EntryPoint 以實際 gas 成本補償返畀 bundler(因為 bundler 幫你預付咗;見上面第 2 步)。任何剩低嘅 ETH 會留喺 EntryPoint,當作你之後交易嘅按金。
ERC-20 Transfers: 顯示實際代幣移動:
我哋個錢包並無直接送出 USDC。相反,USDC 代幣合約(…2A8)處理並發出轉賬。呢個好正常:喺 EVM 鏈上,代幣轉賬係由代幣合約喺收到你嘅智能合約錢包指令之後自己執行。
USDC 合約將我哋嘅 1 USDC 分成三筆轉賬:
0.0022 USDC 到我哋協議嘅費用錢包(…608A)
0.0005 USDC 到 1inch 嘅費用錢包(…1DE5)
剩低嘅 0.9973 USDC 到 Uniswap v4 路由器(…Universal Router)
Uniswap v4 路由器再交畀 Uniswap v4 Pool Manager(單一合約處理所有 v4 池)。
Pool Manager 執行咗換幣:USDC 入 → KTA 出。
KTA 經 1inch 嘅 Aggregation Router 路回我哋個錢包(…0A5)。
🧩 點樣解讀失敗嘅 SCW 交易
而家明咗 SCW 換幣點運作——亦都走過一單成功交易——用同一套工具去拆解一單失敗嘅。
再用另一個真實案例:喺 Ethereum 上做 ETH → 代幣嘅換幣,喺 EntryPoint 合約入面失敗,因為冇足夠 ETH 同時覆蓋換幣同 gas 費。
好,你喺 app 見到換幣狀態係「Error」或者收到推送話你嘅換幣失敗。可以點做?
步驟 1 — 喺 goodcryptoX 檢查訂單詳情
呢個情況你會見到:
用我哋啱啱建立嘅框架,你會好快留意到:
換幣狀態係
Error
(失敗?)冇顯示錯誤訊息 (唔常見)
有 gas 費 (上到鏈?)
有顯示路線 (模擬冇問題?)
有區塊瀏覽器連結 (我可以喺鏈上查 tx!)
一齊驗證你嘅直覺:
GOOD 代幣
Error
status 代表換幣失敗應該會有可讀嘅錯誤訊息(由 raw 轉譯)同埋原始錯誤。冇錯誤訊息基本上代表有啲非一般嘅情況發生
有 gas 費確實代表交易上到鏈,並且發生咗某啲消耗 gas 嘅鏈上行為
Route 證實交易模擬通過,並產生清晰嘅執行路徑
Explorer 連結證實交易已到達區塊鏈——即使失敗。我哋一定要開其中一個繼續查
步驟 2 – 喺區塊鏈瀏覽器打開呢筆交易
你撳 Etherscan 連結睇下發生咗乜:
第一眼望落去,更加迷惘:
狀態寫住 ✅ Success — 等等,咩話?!
但我哋已經知道換幣 冇完成
喺「To」欄(EntryPoint)下面,有一段黃色細字:
「雖然發生一個或多個錯誤【執行回退】合約執行已完成」
咁其實發生緊咩事?
記得之前講過嘅 SCW 交易流程:
bundler 會將你嘅換幣包成一個
UserOperation(用戶操作)
(帶有你換幣邏輯嘅數據包)然後送去 EntryPoint 智能合約
EntryPoint 會驗證(檢查你嘅餘額、簽名同 nonce)
如果全部通過,就會執行你嘅意圖——call 路由器、池,移動代幣。
但喺區塊鏈角度睇,成件事只係「bundler 傳數據去 EntryPoint」。
用 SCW 嘅術語,呢步叫做 外層
交易。
而嗰筆交易確實係成功嘅:數據送到,EntryPoint 開始跑內部邏輯。所以上面先會顯示 ✅ Success。
但瀏覽器都好有禮貌噉提示你有啲嘢喺 內部 EntryPoint 入面失敗。對瀏覽器嚟講,呢個內部失敗唔足以將交易標記為失敗。
而家,Overview 分頁有另一個細節彈出嚟:
大約 $6 咁多 ETH 由你個錢包送到 EntryPoint(gas 預存)。
只有 $2.3 咁多 ETH 補償返畀 bundler。
而頂部顯示嘅 Transaction Fee 仲更低——大約 $2.15.
第一眼睇落,呢啲數好似對唔上。喺繼續調查之前先拆解呢點。
步驟 3 – 理解 gas 差異
分解如下:
SCW → EntryPoint (約 $6):呢個係 gas 預存。EntryPoint 永遠會收多啲去確保你嘅 UserOp 可以跑得郁。
EntryPoint → Bundler (約 $2.3):呢個係實際 gas 補償。呢個係你 實際支付嘅數 ,對應今次失敗嘗試。
Transaction Fee (約 $2.15):呢個係 bundler 為將你嘅 UserOp 送去 EntryPoint 所花嘅費。會低啲,因為 EntryPoint 自己喺驗證同補償 bundler 嘅時候用多咗 gas——嗰部分由你埋單。
經驗法則:
👉 你真正嘅 gas 成本永遠係 EntryPoint ➜ Bundler 嗰筆補償(唔係頂部顯示嘅「Transaction Fee」)
而你預存($6)同實際補償($2.3)之間嘅差額冇消失。佢留喺 EntryPoint 入面,作為你嘅按金,自動用喺你下一筆交易。
步驟 4 – 睇 AA Transactions 分頁
喺瀏覽器,你會見到一個 AA Transactions 分頁(AA = 帳戶抽象)。智能合約錢包嘅活動就喺度,因為 SCW 係跑喺帳戶抽象(ERC-4337)之上。
由 Overview 轉去嗰個分頁:
你終於會見到我哋嘅 UserOperation 以獨立條目出現喺 bundler 外層交易入面:
「From」欄而家顯示 我哋嘅錢包地址,確認呢個就係我哋嘅操作。
有個獨立嘅 AA Txn Hash,同外層交易 hash 唔同。點解?
外層 Txn Hash 係 Bundler->EntryPoint 嗰筆載住你 UserOp 嘅交易(亦可能載住多個用戶嘅 UserOp)。
AA Txn Hash 係 你嘅 UserOperation 喺嗰個 bundle 入面嘅唯一識別符。
呢個就係打包嘅關鍵概念:
一個 bundler 可以將好多 UserOp 一齊打包成一筆交易。
每個 UserOp 都有自己嘅 AA Txn Hash,可以喺 bundle 入面獨立追蹤。
喺我哋呢個案例,因為係舊交易(400+ 日前),SCW 仲罕有,個 bundle 只包含我哋嘅 UserOp——所以分頁先寫住「AA Transactions (1)」。新啲嘅交易你經常會見到多個 UserOp 一齊打包。
喺呢個視圖,你仲會見到一個 (!) icon 喺你嘅 AA Txn Hash 旁邊——確認你嘅換幣冇執行。
下一步就係撳入 AA Txn Hash。會打開專屬嘅 UserOperation 頁面,你會見到我哋換幣嘗試嘅全部細節——費用、轉賬、同埋喺邊度失敗。
步驟 5 – 打開 AA 交易詳情頁
撳 AA Txn Hash 之後會去到你 UserOperation 嘅專屬詳情頁:
喺度你終於可以清楚見到實際換幣嘗試:
Status: x Fail (今次冇歧義)
From:你嘅智能合約錢包地址
AA Transaction Fee:~0.00231 ETH($2.31)。呢個就係你實際支付嘅 gas 成本——補償俾 bundler 嗰筆。
Internal transaction:一筆 ~0.00145 ETH($6.36)由你嘅 SCW 到 EntryPoint(gas 預存)。冇其他轉賬,證實換幣本身未有執行。
Bundle Txn Hash:亦會顯示,連回外層 bundler 交易。
呢個頁面終於同你嘅直覺一致:呢個先係真正嘅交易——代表你換幣嘗試嘅 UserOperation。
差唔多查清晒。不過既然嚟到呢度,都撳埋 Internal Txns.
步驟 6 – 檢查 Internal Transactions 分頁
喺 AA 交易視圖內切到 Internal Txns 分頁:
你會見到 EntryPoint 代你嘗試做嘅逐步動作:
✅ 由你嘅 SCW → EntryPoint 轉賬(~0.00145 ETH,~$6.36)= gas 預存。呢步成功。
❌ 由你嘅 SCW → Uniswap Universal Router 執行(~0.002 ETH)= 嘗試換幣。呢步失敗。
呢個分解解釋咗點解會失敗:
你成功將 ETH 畀咗 EntryPoint 作為 gas 預存。
但到 EntryPoint 嘗試將 ETH 轉去 Uniswap 做換幣嗰刻,個嘗試失敗。
想要最詳細嘅分解,就開 Logs 分頁。
步驟 7 – 檢視 Logs 分頁
撳 Logs(3):
你會見到三個關鍵事件:
Deposited → 確認你嘅 gas 預存已被 EntryPoint 收到。
BeforeExecution → 顯示 EntryPoint 已開始處理你嘅 UserOperation。
UserOperationEvent →
success:False
— 鏈上標準記錄,表明你嘅 UserOp 失敗。
實際發生嘅事(全部串埋)
呢種類型嘅失敗係 SCW 喺 EVM 上,以原生代幣(ETH、BNB、MATIC…)作輸入去換幣時特有。
盲點:無論係 bundler 定 EntryPoint 都冇檢查你係咪有足夠 原生代幣 可以同時覆蓋 gas 預存同換幣兩者。佢哋淨係分開檢查——「夠唔夠俾 gas?」同「夠唔夠做換幣?」。所以模擬會通過。
我哋喺 app 入面為呢啲情況加咗保險,喺介面度警告你 gas 可能不足。但因為模擬睇落冇問題,你仍然可以繼續。
你確認之後,bundler 就將你嘅 UserOperation 提交去 EntryPoint。
EntryPoint 抽咗大約 $6 等值嘅 ETH 作為預存。
到佢嘗試執行換幣時,已經冇足夠 ETH 可以同時覆蓋換幣同 同 預存。
換幣嘅 call 喺 EntryPoint 入面回退。
你仍然支付咗大約 $2.3 嘅 gas(補償畀 bundler)。
未用嘅大約 $3.7 留喺 EntryPoint 作為你嘅按金,會自動用喺你下一筆交易。
Last updated