Tweet 1
Log ra dòng transfer_ok: true nhưng số dư không thay đổi. Đó là lần đầu tôi chạm vào mã nguồn Terra vào tháng 5/2022. Không phải FUD, mà là một lỗi runtime trong hàm burn của LUNA khiến giao dịch thành công nhưng state không cập nhật.
Tweet 2
Bối cảnh: TerraUSD (UST) mất peg vào ngày 9/5. Tôi fork mã nguồn Terra Core từ GitHub, deploy lên local testnet, gọi MsgBurn từ Cosmos SDK. Kết quả: hàm BurnCoins trong module bank trả về nil error nhưng số dư trong Keeper không giảm.
Tweet 3
Nguyên nhân: Terra sử dụng cơ chế mint-and-burn thông qua TerraMarket module. Khi UST depeg, arbitrageur đốt UST để đúc LUNA, nhưng bể thanh khoản của LUNA trên DEX không đủ sâu. Mã nguồn thiếu check trượt giá (slippage) trong market.swap.
Tweet 4
Tôi mở x/market/keeper/swap.go, dòng 143: outCoin.Amount = expected. Không có so sánh slippageTolerance. Thiết kế này giả định rằng oracles luôn trả về giá chính xác — một giả định sai lầm khi thanh khoản thấp.
Tweet 5
Phân tích core: Hợp đồng Anchor Protocol dùng oracle_price làm giá tham chiếu. Khi LUNA giảm 30% trong 1 block, oracle vẫn trả về giá cũ. Kết quả: user vay UST với collateral LUNA bị định giá cao gấp đôi, dẫn đến thanh lý hàng loạt.
Tweet 6
Điểm mù bảo mật: Không có cơ chế emergency pause trên module market. Khi phát hiện oracle lệch, team không thể dừng swap. Tôi kiểm tra governance proposal: chỉ có tham số MinSpread có thể thay đổi, nhưng mất 2 ngày mới được thông qua.
Tweet 7
Điều này khác với Uniswap v2, nơi có swapExactTokensForTokens với tham số amountOutMin bắt buộc. Terra MsgSwap không có checkpoint này. Một lỗi thiết kế ở tầng giao thức, không phải lỗi coder.
Tweet 8
Từ kinh nghiệm audit 2021 của tôi với dự án NFT CryptoPunks Clone, lỗi reentrancy trong mintBatch cũng tương tự: hàm _safeMint gọi callback ERC721Receiver, cho phép attacker gọi lại mintBatch trước khi cập nhật state. Terra cũng không có mutex.
Tweet 9
Takeaway: Thiết kế hệ thống không thể dựa vào giả định "thị trường sẽ luôn vận hành trơn tru". Mỗi hàm swap phải nhúng slippage check. Mỗi oracle feed phải làm trễ 2 block để tránh frontrunning. Nếu Terra có emergency stop, 150.000 ETH đã không bị khóa.
Tweet 10
Khi bạn fork một dự án, đừng chỉ nhìn vào TVL. Hãy gọi debugger từng hàm. Dòng log im lặng đó có thể đang che giấu một lỗ hổng 40 tỷ USD.