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?

© Hiếu Trần 2020 - 2025

Tip: Use console.table() for better array logging!