OnChain Transaction Debugging - Lesson 2: 熱身篇
February 1st, 2023

Author: Sun

社群 Discord

同步發表: XREX | WTF Academy

鏈上交易數據包含從簡單的單筆交易轉帳、1 個 DeFi 合約交互、多個 DeFi 合約交互、閃電貸套利、治理提案、跨鏈交易等等,這一節我們先來熱身一下,先從簡單的開始。我將介紹通常使用區塊鏈瀏覽器 Etherscan 哪些訊息是我們所在意的,再來我們會使用交易分析工具 Phalcon 看一下這些交易從簡單的轉帳、UniSWAP上 Swap、Curve 3pool 增加流動性、Compound 治理提案、閃電貸的調用差異。

開始進入熱身篇

  • 首先環境上需要先安裝 Foundry,安裝方法請參考 instructions.

  • 每條鏈上都有專屬的區塊鏈瀏覽器,這節我們都會使用 Ethereum 主網來當案例所以可以透過 Etherscan 來分析.

  • 通常我會特別想看的欄位包含:

    • Transaction Action: 因為複雜的交易中 ERC-20 Tokens Transferred 會很複雜,可讀性不好,所以可以透過 Transaction Action 看一下關鍵行為但不一定每筆交易都有

    • From: msg.sender 執行這筆交易的來源錢包地址

    • Interacted With (To): 跟哪個合約交互

    • ERC-20 Tokens Transferred: 代幣轉移流程

    • Input Data: 交易的原始 Input 資料,可以看到呼叫什麼 Function 和帶入什麼 Value

  • 如果還不知道常用工具有哪些可以回顧第一課交易分析工具篇

鏈上轉帳

From: 發送這筆交易的來源錢包地址

Interacted With (To): Tether USD (USDT) 合約

ERC-20 Tokens Transferred: 從用戶A 錢包轉 651.13 USDT 到用戶 B

Input Data: 呼叫了 transfer function

透過 phalcon 來看: 從調用流程來看就只有一個 Call USDT.transfer,要注意的是 Value. 因為 EVM 不支持浮點數的運算,所以使用精度代表,每個 Token 都要注意它的精度大小,標準 ERC-20 代幣精度為 18,但也有特例,如 USDT 為例,精度是 6 所以 Value 帶入的值為 651130000,如果精度處理不當就容易造成問題。精度的查詢方式可以到 Etherscan 代幣合約上看到。

Uniswap Swap

從上圖例子 可以解讀為:

Transaction Action: 很直覺就可以知道用戶在 Uniswap 上進行 Swap,將 12,716 USDT 換成 7,118 UNDEAD。

From: 發送這筆交易的來源錢包地址

Interacted With (To): 這個例子是一個 MEV Bot 合約呼叫 Uniswap 合約進行 Swap

ERC-20 Tokens Transferred: Token 交換的過程

透過 phalcon 來看: MEV Bot 呼叫 Uniswap V2 USDT/UNDEAD 交易對合約呼叫 swap 函示來進行代幣兌換。

我們使用 Foundry 來模擬操作使用 1BTC 在 Uniswap 換成 DAI,範例程式碼參考,執行以下指令

forge test --contracts ./src/test/Uniswapv2.sol -vvvv

如下圖所示我們透過呼叫 Uniswap_v2_router.swapExactTokensForTokens 函式,將 1BTC 換到 16,788 DAI.

Curve 3pool - DAI/USDC/USDT

從上圖例子可以解讀為:

在 Curve 3pool 增加流動性

From: 發送這筆交易的來源錢包地址

Interacted With (To): Curve.fi: DAI/USDC/USDT Pool

ERC-20 Tokens Transferred: 用戶 A 轉入 3,524,968.44 USDT 到 Curve 3 pool,然後 Curve 鑄造 3,447,897.54 3Crv 代幣給用戶 A.

透過 phalcon 來看: 從調用流程來看執行了三個步驟 1.add_liquidity 2.transferFrom 3.mint

Compound propose

從上圖例子可以解讀為: 用戶在 Compound 治理合約上提交了一個提案,從 Etherscan 上可以點擊 Decode Input Data 就可以看到提案內容。

透過 phalcon 來看: 透過呼叫 propose 函式來提交 proposal 得到編號 44 號提案。

Uniswap Flashswap

我們使用 Foundry 來模擬操作看看如何在 Uniswap 上使用閃電貸,官方Flash swap介紹

範例程式碼參考,執行以下指令

forge test --contracts ./src/test/Uniswapv2_flashswap.sol -vv

以這個例子透過 Uniswap UNI/WETH 交易兌上進行閃電貸借出 100 顆 WETH,再還回去給 Uniswap. 注意還款時要付 0.3% 手續費。

從下圖調用流程可以看出,呼叫 swap 進行 flashswap 然後透過 callback uniswapV2Call 來還款。

簡單區分一下 Flashloan 和 Flashswap 的差異,兩種都是無需抵押資產就可以借出 Token,且需要在同一個區塊內還回去不然交易就會失敗,假如透過 token0/token1 進行 Flashloan 借出 token0 就要還 token0回去,Flashswap 借出 token0 可以還 token0 或 token1 回去,比較彈性。

更多 DeFi 基本操作可以參考 DeFiLabs

Foundry cheatcodes

Foundry 的 cheatcodes 在我們做鏈上分析必須使用到的,這邊我介紹一下常用到的函式,更多介紹可以參考 Cheatcodes Reference

  • createSelectFork: 指定這次測試要複製哪個網路和區塊高度,注意每條鏈的 RPC 要寫在 foundry.toml

  • deal: 設定測試錢包餘額

    • 設定 ETH 餘額 deal(address(this), 3 ether);

    • 設定 Token 餘額 deal(address(USDC), address(this), 1 * 1e18);

  • prank: 模擬指定錢包身份,只有在下一個呼叫有效,下一個 msg.sender 是會所指定的錢包,例如使用巨鯨錢包轉帳

  • startPrank: 模擬指定錢包身份,在沒有執行stopPrank()之前,所有 msg.sender 都會是指定的錢包地址

  • label: 將錢包地址標籤化,方便在使用 Foundry debug 時提高可讀性

  • roll: 調整區塊高度

  • warp: 調整 block.timestamp

謝謝收看,我們準備進入下一課

Resources

Foundry @EthCC | Slides

Subscribe to SunWeb3Sec
Receive the latest updates directly to your inbox.
Nft graphic
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from SunWeb3Sec

Skeleton

Skeleton

Skeleton