date
Dec 16, 2025
slug
docs-traning-be-intern-week-5
status
Published
tags
NestJs
Backend
summary
Tổng hợp docs trainning back-end Intern Week 5
type
Post
TUẦN 5 – SMART CONTRACT FUNDAMENTALS
Mục tiêu tuần
- Hiểu smart contract chạy như thế nào trong EVM
- Nắm cú pháp Solidity cốt lõi
- Hiểu storage / memory / calldata
- Biết deploy – test – debug contract
- Nhận thức được giới hạn và rủi ro của contract
1. Smart Contract là gì? (Hiểu đúng bản chất)
Smart contract KHÔNG phải:
- Backend code
- Script chạy 1 lần
Smart contract LÀ:
- Chương trình chạy trong EVM
- Immutable sau khi deploy
- Mỗi function call = transaction hoặc call
👉 Mỗi dòng code đều có chi phí gas.
2. Solidity ≠ JavaScript
Khác biệt quan trọng
- Không có garbage collector
- Không có floating point
- Không thể gọi HTTP
- Không thể truy cập DB
👉 Tư duy: viết ít – chắc – rõ ràng.
3. Cấu trúc một Smart Contract
pragma solidity ^0.8.20;
contract Vault {
uint256 public balance;
function deposit() external payable {
balance += msg.value;
}
}
Các thành phần
- pragma
- contract
- state variable
- function
4. State Variable & Storage
State variable
- Lưu trong storage
- Tốn gas khi ghi
Storage
- Tồn tại vĩnh viễn
- Mỗi slot = 32 bytes
👉 Ghi storage = rất đắt.
5. Function & Visibility
Visibility
- public
- external
- internal
- private
👉 Dùng sai visibility = tốn gas hoặc lộ logic.
6. msg Context (CỰC KỲ QUAN TRỌNG)
msg.sender
- Ai gọi function
msg.value
- ETH gửi kèm
block.timestamp
- Thời gian block (KHÔNG chính xác tuyệt đối)
7. require, revert, assert
require
- Validate input
- Trả lỗi có message
revert
- Chủ động hủy
assert
- Logic không bao giờ sai
8. Event – Cầu nối on-chain ↔ off-chain
Event dùng để:
- Log hoạt động
- Backend index
👉 Backend không đọc storage liên tục, mà nghe event.
9. Memory vs Storage vs Calldata
storage
- Lưu lâu dài
- Đắt
memory
- Tạm thời
- Rẻ hơn
calldata
- Read-only
- Rẻ nhất (input)
👉 Dùng sai → tốn gas vô ích.
10. Mapping & Struct
Mapping
mapping(address => uint256) balances;
Struct
struct User {
uint256 amount;
bool active;
}
👉 Mapping không iterable → cần event / indexer.
11. Ether & Payable
payable
- Cho phép nhận ETH
Transfer ETH
- call{value: x}("")
- Không dùng transfer (gas limit)
12. Deploy Contract – Hiểu quá trình
Deploy là gì?
- Tạo contract account
- Ghi bytecode vào blockchain
👉 Deploy = tốn gas rất lớn.
13. Tooling – Hardhat
Hardhat dùng để:
- Compile
- Deploy
- Test
- Debug
14. Bài tập BẮT BUỘC (Hands-on)
Bài 1 – Contract cơ bản
Viết Vault:
- deposit ETH
- withdraw ETH
- emit event
Bài 2 – Event
- Emit khi deposit
- Emit khi withdraw
Bài 3 – Deploy & verify
- Deploy testnet
- Verify contract
15. Checklist TỰ KIỂM TRA
- Vì sao smart contract immutable?
- storage khác memory thế nào?
- Vì sao loop lớn nguy hiểm?
- Event khác log backend thế nào?
- Vì sao contract không gọi API?
- msg.sender là ai khi backend gọi?