Mở đăng ký khóa học Fullstack qua Zoom. Tham khảo tại đây

Thư Viện Câu Hỏi Phỏng Vấn

Tổng hợp các câu hỏi tuyển dụng thực tế theo nhiều cấp độ từ Entry đến Expert để bạn tự tin chinh phục nhà tuyển dụng.

Interactive Practice Tổng cộng 4,442 câu hỏi độc bản

Luyện Tập Phỏng Vấn Thử

Mô phỏng áp lực phỏng vấn thật với đồng hồ đếm ngược từng câu, tự đánh giá phản xạ và đo lường độ sẵn sàng của bạn.

Vui lòng đăng nhập để tham gia luyện tập và lưu tiến độ phỏng vấn.
Tất cả công nghệ .Net (39) ADO.NET (44) Agile scrum (33) Android (40) Angular (40) API Design (40) Arrays (40) ASP.NET (42) ASP.NET MVC (40) ASP.NET Web API (49) Availability & Reliability (40) Azure (49) Backtracking (40) Big-O Notation (35) Binary Tree (40) Bit Manipulation (40) Blockchain (45) C# (45) Caching (50) CAP Theorem (45) CDN (45) Concurrency (49) Cosmos DB (44) Cryptography (40) CSS (40) Data Structures (40) Databases (35) DDD (42) Dependency Injection (50) Design pattern (45) Devops (50) Divide & Conquer (40) Docker (43) Dynamic Programming (40) Entity Framework (40) Fibonacci Series (35) Flutter (40) Git (40) Go lang (40) Graph Theory (40) GraphQL (40) Greedy Algorithms (40) Hash Tables (40) Heaps and Maps (35) HTML (40) Ionic (45) IOS (45) Java (73) Javascript (81) jQuery (40) Kotlin (50) Kubernetes (11) Laravel (41) Layering & Middleware (44) Linked Lists (45) LINQ (40) Load Balancing (45) Microservices (44) Mongodb (45) MySQL (44) Net core (44) next.js (52) Node.js (40) NoSQL (48) Objective-C (40) OOP (44) Package Managerment (50) PHP (40) PostgreSQL (44) PWA (40) Python (41) Queues (44) React Native (48) React.js (45) Reactive Programming (50) Recursion (45) Redis (40) Ruby (44) Ruby on Rails (48) Rust (40) Searching (45) SOA (42) Software Architecture (44) Software Testing (40) Sorting (48) Spring (45) SQL (37) SQL Server (45) Stacks (44) Strings (50) Swift (45) System Design (56) Systems Design (7) T-SQL (39) Trees (49) Trie (35) Typescript (44) Unit testing (49) UX Design (50) Vue.js (50) Web security (40) WebSockets (49) Xamarin (40)
Khóa học Chuyên sâu Blockchain

Làm Chủ Phỏng Vấn & Nâng Cao Trình Độ Chuyên Nghiệp

Hệ thống khóa học thực chiến chuẩn Enterprise giúp bạn tự tin chinh phục mọi kỳ phỏng vấn kỹ thuật và thăng tiến thu nhập.

01

Làm thế nào để triển khai và tối ưu hóa thuật toán hoặc cấu trúc dữ liệu liên quan đến Smart Contracts trong chủ đề Blockchain?

Entry

Trong lập trình giải thuật với Blockchain, việc làm chủ Smart Contracts yêu cầu lập trình viên hiểu rõ cấu trúc vật lý trong bộ nhớ và độ phức tạp tính toán:

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
02

Trong Solidity, tại sao việc sử dụng tx.origin để xác thực quyền sở hữu (Authentication) lại tiềm ẩn rủi ro bảo mật nghiêm trọng?

Junior

Việc sử dụng tx.origin để kiểm tra quyền truy cập là một lỗ hổng bảo mật kinh điển vì nó đại diện cho địa chỉ tài khoản đã khởi tạo giao dịch ban đầu, không phải địa chỉ của Smart Contract đang gọi hàm. Kẻ tấn công có thể tạo một hợp đồng trung gian (Attacker Contract) để lừa người dùng (hoặc chủ sở hữu hợp đồng) thực hiện một giao dịch gọi vào hợp đồng của kẻ tấn công. Khi đó, tx.origin vẫn là địa chỉ của người dùng, khiến các hàm kiểm tra quyền bị vượt qua. Thay vào đó, hãy luôn sử dụng msg.sender để xác thực vì nó đại diện cho thực thể trực tiếp gọi vào hàm hiện tại. Ví dụ: thay vì require(tx.origin == owner), hãy dùng require(msg.sender == owner).

03

Giải thích khái niệm Shadowing trong Solidity và tại sao nó lại gây ra các lỗi logic khó phát hiện trong quá trình phát triển Smart Contract?

Junior

Shadowing xảy ra khi một biến trong phạm vi con (ví dụ: biến cục bộ hoặc biến trong hợp đồng kế thừa) có cùng tên với một biến trong phạm vi cha hoặc phạm vi toàn cục. Điều này khiến trình biên dịch ghi đè hoặc gây nhầm lẫn khi truy xuất giá trị, dẫn đến việc hợp đồng đọc sai dữ liệu lưu trữ. Để tránh điều này, cần tuân thủ quy tắc đặt tên rõ ràng, sử dụng tiền tố (như hoặc m) cho các biến trạng thái hoặc biến tham số. Trình biên dịch Solidity hiện đại sẽ đưa ra cảnh báo (warning) khi phát hiện shadowing; nhà phát triển tuyệt đối không được bỏ qua các cảnh báo này để đảm bảo tính toàn vẹn của dữ liệu.

04

Trong kiến trúc Blockchain, tại sao việc sử dụng các hàm tạo số ngẫu nhiên (Random Number Generation) trực tiếp trong Smart Contract lại không an toàn?

Junior

Blockchain là môi trường tất định (deterministic), nghĩa là mọi node đều phải tính toán ra cùng một kết quả. Các biến như block.timestamp, block.difficulty hay blockhash đều có thể bị thao túng bởi các thợ đào (miners) hoặc validator để thay đổi kết quả ngẫu nhiên theo ý muốn. Để tạo số ngẫu nhiên an toàn trong Enterprise, cần sử dụng các giải pháp Oracle phi tập trung như Chainlink VRF (Verifiable Random Function). Chainlink VRF cung cấp bằng chứng mã hóa chứng minh tính ngẫu nhiên của con số được tạo ra, đảm bảo tính công bằng và không thể bị can thiệp bởi bất kỳ bên nào.

05

Sự khác biệt giữa việc sử dụng Event và lưu trữ dữ liệu trực tiếp vào Storage trong Smart Contract về mặt chi phí Gas là gì?

Junior

Lưu trữ dữ liệu vào Storage (biến trạng thái) là thao tác tốn kém nhất trong Solidity vì dữ liệu được ghi vĩnh viễn vào trạng thái của blockchain và mọi node đều phải lưu trữ. Ngược lại, Event là cơ chế ghi dữ liệu vào log của giao dịch. Dữ liệu trong Event không thể được truy cập bởi các Smart Contract khác, nhưng nó rẻ hơn đáng kể và cho phép các ứng dụng Frontend (thông qua Web3.js hoặc Ethers.js) truy vấn dữ liệu lịch sử một cách hiệu quả. Kinh nghiệm thực chiến là chỉ lưu trữ vào Storage những dữ liệu cần thiết cho logic của hợp đồng, còn lại hãy sử dụng Event để lưu trữ dữ liệu phục vụ mục đích hiển thị hoặc phân tích.

06

Tại sao việc sử dụng modifier trong Solidity lại được coi là một Best Practice để tối ưu hóa code và đảm bảo tính bảo mật?

Junior

Modifier giúp tách biệt logic kiểm tra (validation logic) ra khỏi logic nghiệp vụ chính của hàm, giúp mã nguồn trở nên sạch sẽ, dễ đọc và dễ bảo trì (DRY - Don't Repeat Yourself). Về mặt bảo mật, nó đảm bảo các điều kiện tiên quyết (như kiểm tra quyền, trạng thái hợp đồng) được thực thi nhất quán trước khi code chính của hàm chạy. Nếu không sử dụng modifier, việc lặp lại các câu lệnh require() ở đầu mỗi hàm dễ dẫn đến sai sót hoặc quên kiểm tra trong các bản cập nhật sau này. Ví dụ: modifier onlyOwner { require(msg.sender == owner); _; } giúp đảm bảo tính an toàn cho các hàm quản trị quan trọng.

07

Trong Solidity, tại sao việc sử dụng biến kiểu mapping lại không thể duyệt qua (iterate) được và giải pháp thay thế nào để quản lý danh sách các phần tử trong Smart Contract?

Junior

Bản chất của Mapping

Mapping trong Solidity hoạt động như một bảng băm (hash table) ảo. Các khóa (key) không được lưu trữ trực tiếp mà được sử dụng để tính toán vị trí lưu trữ thông qua hàm băm Keccak-256. Do đó, không có danh sách các khóa tồn tại trong bộ nhớ, khiến việc duyệt qua (iteration) là không thể.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
08

Sự khác biệt giữa việc sử dụng memory và calldata trong các tham số của hàm trong Solidity là gì và khi nào nên ưu tiên sử dụng calldata?

Junior

Phân tích kỹ thuật

  • Memory: Là vùng nhớ tạm thời, dữ liệu có thể thay đổi được (mutable). Khi truyền tham số vào hàm, dữ liệu được copy từ nguồn vào vùng nhớ memory.
  • Calldata: Là vùng nhớ chỉ đọc (read-only), chứa dữ liệu đầu vào của giao dịch. Dữ liệu này không thể thay đổi và không tốn chi phí copy vào memory.

Tại sao ưu tiên calldata?

  • Tiết kiệm Gas: Sử dụng calldata giúp tránh việc copy dữ liệu tốn kém vào memory.
  • An toàn: Vì là read-only, nó đảm bảo dữ liệu đầu vào không bị thay đổi ngoài ý muốn trong quá trình thực thi hàm.

Ví dụ

function processData(string calldata input) external pure {
    // Sử dụng calldata cho tham số đầu vào không thay đổi
}

Lưu ý

Chỉ sử dụng calldata cho các tham số đầu vào của hàm (external/public). Nếu bạn cần sửa đổi dữ liệu bên trong hàm, bạn buộc phải copy nó sang memory hoặc storage.

09

Tại sao việc sử dụng hàm transfer() hoặc send() để gửi Ether trong các Smart Contract hiện đại được coi là không còn an toàn?

Junior

Nguyên nhân

Các hàm transfer() và send() có giới hạn cố định là 2300 gas. Giới hạn này được thiết kế để ngăn chặn Reentrancy Attack trong quá khứ. Tuy nhiên, với các bản cập nhật của Ethereum (như EIP-1884), chi phí của các opcode có thể thay đổi, khiến 2300 gas không còn đủ để thực hiện các logic cần thiết (ví dụ: ghi vào storage hoặc gọi hàm khác).

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
10

Giải thích khái niệm Gas Limit và Gas Price trong một giao dịch Ethereum và điều gì xảy ra nếu giao dịch của bạn tiêu tốn nhiều gas hơn mức Gas Limit đã thiết lập?

Junior

Định nghĩa

  • Gas Limit: Là số lượng gas tối đa mà người dùng sẵn sàng chi trả cho việc thực thi giao dịch. Nó đóng vai trò như một cơ chế an toàn để ngăn chặn các vòng lặp vô tận.
  • Gas Price: Là số tiền (tính bằng Gwei) mà người dùng trả cho mỗi đơn vị gas để các validator ưu tiên xử lý giao dịch.

Khi vượt quá Gas Limit

Nếu giao dịch tiêu tốn nhiều gas hơn mức Gas Limit đã thiết lập, máy ảo Ethereum (EVM) sẽ dừng thực thi giao dịch ngay lập tức. Trạng thái của Smart Contract sẽ được hoàn tác (revert) về trạng thái ban đầu, nhưng toàn bộ lượng gas đã sử dụng cho đến thời điểm đó sẽ bị mất và không được hoàn lại cho người gửi.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
11

Trong Solidity, sự khác biệt giữa hàm view và pure là gì? Tại sao việc sử dụng đúng các từ khóa này lại quan trọng đối với hiệu năng hệ thống?

Junior

Phân biệt

  • view: Hàm được phép đọc dữ liệu từ trạng thái (storage) của contract nhưng không được phép thay đổi trạng thái đó.
  • pure: Hàm không được phép đọc cũng như không được phép thay đổi trạng thái của contract. Nó chỉ thực hiện tính toán dựa trên các tham số đầu vào.

Tầm quan trọng đối với hiệu năng

  • Khi gọi các hàm này từ bên ngoài (off-chain) thông qua các node, chúng không tốn gas vì không cần tạo giao dịch trên mạng lưới.
  • Việc khai báo đúng giúp trình biên dịch tối ưu hóa mã bytecode và giúp các công cụ phân tích bảo mật hiểu rõ hành vi của hàm.

Ví dụ

uint256 public value;
function getValue() public view returns (uint256) { return value; } // Đọc storage
function add(uint256 a, uint256 b) public pure returns (uint256) { return a + b; } // Chỉ tính toán

Lưu ý

Nếu bạn khai báo hàm là view hoặc pure nhưng lại thực hiện ghi dữ liệu (ví dụ: thay đổi giá trị biến state), trình biên dịch sẽ báo lỗi.

12

Trong Solidity, tại sao việc sử dụng biến kiểu uint256 lại được ưu tiên hơn so với các kiểu dữ liệu nhỏ hơn như uint8 hoặc uint16 trong các cấu trúc lưu trữ (Storage) của Smart Contract?

Junior

Trong máy ảo Ethereum (EVM), các biến được lưu trữ trong các slot có kích thước 32 bytes (256 bits). Khi bạn sử dụng các kiểu dữ liệu nhỏ hơn như uint8, EVM vẫn phải dành ra một slot 32 bytes để lưu trữ giá trị đó. Để thực hiện các phép toán trên các kiểu dữ liệu nhỏ hơn này, EVM phải thực hiện thêm các thao tác chuyển đổi (masking) để đảm bảo dữ liệu nằm trong phạm vi cho phép, điều này tiêu tốn thêm Gas. Do đó, việc sử dụng uint256 giúp tối ưu hóa Gas bằng cách loại bỏ các bước tính toán dư thừa và tận dụng tối đa không gian lưu trữ của một slot.

13

Giải thích cơ chế hoạt động của fallback function và receive function trong Solidity. Khi nào một Smart Contract sẽ kích hoạt các hàm này?

Junior

Cả hai hàm đều được sử dụng để xử lý các tương tác không xác định hoặc nhận Ether trực tiếp: 1. receive(): Được kích hoạt khi một contract nhận Ether mà không kèm theo dữ liệu (data). Hàm này bắt buộc phải có từ khóa external và payable. 2. fallback(): Được kích hoạt khi một lời gọi hàm đến contract không khớp với bất kỳ hàm nào đã định nghĩa, hoặc khi nhận Ether kèm theo dữ liệu nhưng không có hàm receive. Hàm này cũng cần từ khóa external. Lưu ý: fallback có thể thực hiện các logic phức tạp hơn nhưng bị giới hạn về lượng Gas tiêu thụ nếu được gọi thông qua một lời gọi từ bên ngoài.

14

Tại sao việc sử dụng các vòng lặp (loop) với độ dài không xác định (unbounded loop) trong Smart Contract lại là một rủi ro lớn đối với hệ thống?

Junior

Mỗi giao dịch trên Ethereum đều có một giới hạn Gas (Gas Limit). Nếu một vòng lặp phụ thuộc vào độ dài của một mảng động (dynamic array) mà mảng này có thể tăng kích thước không giới hạn, thì tại một thời điểm nào đó, chi phí thực thi vòng lặp sẽ vượt quá Gas Limit của block. Điều này dẫn đến lỗi Out of Gas, khiến giao dịch bị revert hoàn toàn. Giải pháp thực chiến là sử dụng mô hình Pull-over-Push, trong đó người dùng tự rút tiền hoặc thực hiện thao tác thay vì ép buộc contract phải lặp qua một danh sách lớn để xử lý cho từng người.

15

Sự khác biệt giữa việc sử dụng thư viện (Library) và kế thừa (Inheritance) trong Solidity là gì? Khi nào nên chọn phương án nào?

Junior

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
High-Ticket Mentoring
Cần Mentor Phỏng Vấn Thử 1-1 & Tối Ưu CV?

Mô phỏng phỏng vấn kỹ thuật thực tế 1-1 qua Google Meet, nhận xét chi tiết điểm mạnh/yếu và sửa CV trực tiếp cùng giảng viên Unicode.

AI Resume Scanner
Kiểm Tra CV Chuẩn ATS Miễn Phí

Tải CV của bạn lên để hệ thống AI rà soát từ khóa kỹ năng, định dạng và tính điểm chuẩn nhà tuyển dụng.

vừa nâng cấp PRO khóa 1 phút trước   Tìm hiểu khóa học