M08 — Staking Reward Accounting
1. Bài toán
Thiết kế mô hình staking reward accounting để hiểu các ràng buộc kế toán của DeFi.
2. Vấn đề
Không thể dựa vào UI hoặc backend để đảm bảo invariant tài sản; integer division, rounding, quyền truy cập và thao túng giá gây rủi ro.
3. Giải pháp
Mô hình hóa state và kiểm tra các điều kiện trước/sau mỗi thao tác bằng smart contract cùng unit tests.
4. Lý thuyết
Đọc solution/src/StakingRewards.sol và xác định state, công thức, preconditions, invariants. Đây là mô hình toán học, không phải protocol production; không giữ hoặc chuyển tài sản thật.
5. Lab chi tiết
- Cài Foundry, kiểm tra
forge --version. - Mở
starter/README.md, tự viết contract. - Đối chiếu
solution/src/StakingRewards.sol. - Chạy
cd solution && forge test -vvv. - Thay đổi input, thử trường hợp biên và xem revert.
6. Expected output
[PASS] testScenario(); forge test exit code 0 (expected, chưa xác minh trên môi trường hiện tại).
7. Exercises
- Thêm negative tests cho zero amount, thiếu collateral, duplicate action (nếu áp dụng).
- Viết fuzz test kiểm tra invariant conservation/solvency.
- Giải thích giới hạn rounding và thiết kế giải pháp chống thao túng oracle.
8. Interview
- Tại sao integer rounding ảnh hưởng tài sản trong DeFi?
- State invariant là gì và test thế nào?
- Vì sao mô hình này không được dùng production?
- Làm sao giảm rủi ro từ price oracle?