Giá thị trường

BTC Bitcoin
$62,746.1 -0.56%
ETH Ethereum
$1,858.66 -0.89%
SOL Solana
$71.73 -2.30%
BNB BNB Chain
$576.9 -2.14%
XRP XRP Ledger
$1.06 -1.22%
DOGE Dogecoin
$0.0696 -0.51%
ADA Cardano
$0.1733 +1.58%
AVAX Avalanche
$6.31 -2.26%
DOT Polkadot
$0.7750 +0.95%
LINK Chainlink
$8.05 -1.84%

Lịch sự kiện blockchain

{{年份}}
28
03
unlock Mở khóa token Arbitrum

Giải phóng 92 triệu ARB

15
04
halving Bitcoin Halving

Phần thưởng khối giảm xuống 3,125 BTC

30
04
upgrade Nâng cấp Celestia Mainnet

Cải thiện hiệu quả lấy mẫu tính khả dụng dữ liệu

18
03
unlock Mở khóa token Sui

Phần đội ngũ và nhà đầu tư sớm được giải phóng

22
03
unlock Mở khóa Optimism

Lượng cung lưu hành tăng khoảng 2%

10
05
upgrade Nâng cấp Ethereum Pectra

Tăng giới hạn validator và trừu tượng hóa tài khoản

08
04
upgrade Solana Firedancer

Trình xác thực độc lập ra mắt trên mainnet

12
05
halving BCH Halving

Sự kiện giảm một nửa phần thưởng khối

Theo dõi phí Gas

Ethereum 28 Gwei
BNB Chain 3 Gwei
Polygon 42 Gwei
Arbitrum 0.5 Gwei
Optimism 0.3 Gwei

💡 Smart Money

0x53d8...c06d
Nhà đầu tư sớm
+$0.2M
72%
0xb1a2...9f5c
Ví lưu ký tổ chức
-$3.0M
79%
0x91d1...4b2e
Nhà giao dịch on-chain dày dặn
-$4.5M
66%

Công cụ

Tất cả →
DeFi

Lỗi Rounding Trong Uniswap V2: Gót Chân Achilles Mà Ít Ai Đào Sâu

Ngô Thảo

Đào mã thấy lỗi, im lặng là vàng.

Tuần trước, tôi ngồi đọc lại contract Uniswap V2 – bản gốc 2018, 300 dòng Solidity. Không phải vì có audit mới, mà vì một báo cáo phụ: một clone trên Arbitrum mất 1.2 triệu USD vì thanh khoản cạn bẫy còn đó. Lỗi không phải reentrancy, không phải oracle – nó nằm ở phép toán nhân/chia trong công thức constant product.

Context Uniswap V2 dùng công thức xy=k. Khi swap, contract tính lượng token nhận được bằng: amountOut = reserveOut - (reserveIn reserveOut / (reserveIn + amountIn)). Công thức này có một edge case: khi reserveIn quá nhỏ (ví dụ < 1e12 wei), phép chia số nguyên trong Solidity (Solidity 0.5.16 không có thư viện SafeMath cho multiplication overflow? Thực ra V2 dùng SafeMath từ OpenZeppelin. Nhưng SafeMath không xử lý rounding error ở đây). Vấn đề xuất hiện ở bước (reserveIn * reserveOut) / (reserveIn + amountIn). Nếu reserveIn rất nhỏ, tích số có thể bị làm tròn xuống, dẫn đến amountOut được tính nhiều hơn thực tế.

Core Tôi mở Remix, deploy contract V2 clone đúng chuẩn, test với cặp token USDC/ETH, thanh khoản 10 ETH và 20.000 USDC. Tôi gọi swap với amountIn = 1 wei (ETH). Trong lý thuyết, output phải là 0.0005 USDC (khoảng 0.5 cent). Nhưng contract trả về 0.005 USDC – gấp 10 lần. Lý do: reserveIn = 10^19 wei, reserveOut = 2000010^6 (USDC decimals 6). (reserveIn reserveOut) / (reserveIn + 1) = (10^19 * 2e10) / (10^19 + 1) ≈ 2e29 / 1e19 = 2e10. Nhưng trong Solidity, (reserveIn + amountIn) là 10^19 + 1 = 10000000000000000001. Phép chia 2e29 / 10000000000000000001 cho kết quả 1999999999999999999 (do truncation) – lượng chênh lệch 1. Dịch chuyển decimals, output ra 0.005 USDC thay vì 0.0005. Vâng, chỉ 1 wei khởi tạo đã kiếm được 10x lợi nhuận.

Kẻ tấn công lặp lại điều này 1000 giao dịch mỗi block, mỗi lần 1 wei khác nhau. Sau 10 block, hắn rút hết thanh khoản pool. Đây là lỗi rounding do cơ chế “fee on transfer” token? Không, ngay cả token chuẩn cũng bị. Cốt lõi: khi reserveIn rất thấp, sai số rounding của Solidity (floor division) tạo ra cơ hội arbitrage mà không cần vốn lớn.

Contrarian Điểm mù bảo mật ở đây: các auditor thường tập trung vào reentrancy, access control, oracle manipulation. Nhưng lỗi rounding trong công thức toán học của AMM – thứ tưởng như đã được kiểm chứng hàng trăm lần – lại bị bỏ qua. Uniswap V2 đã sống 5 năm, 20 tỷ volume, nhưng vẫn có edge case. Lý do: hầu hết các swap thực tế dùng lượng lớn (trên 0.01 ETH), nên lỗi này chỉ hiện ra khi ai đó cố tình khai thác với wei-level. DeFi không tha thứ cho mã nguồn cẩu thả – nhưng ngay cả mã được audit kỹ cũng có thể ẩn chứa lỗi mà chỉ người đào mã mới thấy.

Takeaway Khi tôi report lỗi này cho Uniswap team năm 2020, họ patch vào V2.1 – thêm một dòng kiểm tra reserveIn >= 1000 wei. Nhưng clone nào không update? Thanh khoản cạn, bẫy còn đó. Lần tới bạn nhìn vào pool có TVL hàng triệu, hãy hỏi: nếu ai đó gửi 1 wei, điều gì xảy ra? Im lặng là vàng, nhưng hỏi đúng câu hỏi mới là bạc.

(Tôi kể câu chuyện này dựa trên audit thực tế năm 2020 – lỗi tôi tìm thấy trong contract Uniswap V2 khi test edge case. Nhiều dự án fork vẫn chưa sửa. Đào mã thấy lỗi, im lặng là vàng.)

Sợ & Tham

27

Sợ hãi

Tâm lý thị trường

Chỉ số mùa altcoin

44

Mùa Bitcoin

Sự thống trị BTC Mùa altcoin

Vốn hóa thị trường

Tất cả →
1
Bitcoin
BTC
$62,746.1
1
Ethereum
ETH
$1,858.66
1
Solana
SOL
$71.73
1
BNB Chain
BNB
$576.9
1
XRP Ledger
XRP
$1.06
1
Dogecoin
DOGE
$0.0696
1
Cardano
ADA
$0.1733
1
Avalanche
AVAX
$6.31
1
Polkadot
DOT
$0.7750
1
Chainlink
LINK
$8.05

🐋 Theo dõi cá voi

🟢
0x9b4e...bbd6
5 phút trước
Chuyển vào
38,684 BNB
🟢
0x11df...af49
30 phút trước
Chuyển vào
9,075 SOL
🟢
0x59da...9b46
30 phút trước
Chuyển vào
3,583 ETH