Chuyển đến nội dung chính
Change page

Cấu trúc của các hợp đồng thông minh

Cập nhật trang lần cuối: 15 tháng 4, 2026

Hợp đồng thông minh là một chương trình chạy tại một địa chỉ của người dùng trên mạng Ethereum. Chúng được tạo nên bởi dữ liệu và các hàm. Khi nhận được một giao dịch, các hợp đồng thông minh sẽ thực thi. Dưới đây là tổng quan về những gì tạo nên một hợp đồng thông minh.

Điều kiện tiên quyết

Hãy đảm bảo rằng bạn đã đọc về hợp đồng thông minh trước tiên. Tài liệu này giả định rằng bạn đã biết rõ các ngôn ngữ lập trình như JavaScript hoặc Python.

Dữ liệu

Bất kỳ dữ liệu hợp đồng nào cũng phải được gán cho một vị trí: storage hoặc memory. Việc chỉnh sửa nơi lưu trữ trong một hợp đồng thông minh rất tốn kém, vì vậy bạn cần cân nhắc xem dữ liệu của mình sẽ được lưu ở đâu.

Lưu trữ

Storage là nơi lưu trữu các dữ liệu được truy không thường xuyên, ít khi được sửa đổi và được đại diện bởi các biến trạng thái. Các giá trị này được lưu trữ vĩnh viễn trên chuỗi khối. Bạn cần khai báo kiểu dữ liệu để hợp đồng có thể theo dõi được dung lượng lưu trữ trên chuỗi khối mà nó cần khi biên dịch.

// Ví dụ về Solidity
contract SimpleStorage {
    uint storedData; // Biến trạng thái
    // ...
}
# Ví dụ về Vyper
storedData: int128

Nếu bạn đã từng lập trình hướng đối tượng, bạn có thể sẽ quen với hầu hết các loại ngôn ngữ. Tuy nhiên, address có thể sẽ là một khái niệm mới đối với bạn nếu bạn mới bắt đầu phát triển trên Ethereum.

Một loại address có thể chứa một địa chỉ Ethereum tương đương với 20 byte hoặc 160 bit. Nó trả về một giá trị bắt đầu bằng 0x ở dạng thập lục phân.

Các loại kiểu dữ liệu khác:

  • boolean
  • interger
  • fixed point numbers
  • mảng tĩnh
  • mảng byte có kích thước động
  • giá trị cố định hữu tỉ và số nguyên
  • giá trị cố định chuỗi
  • giá trị cố định thập lục phân
  • enums

Để rõ hơn, hãy tìm hiểu thêm các tài liệu:

Bộ nhớ

Memory là nơi lưu trữ các giá trị chỉ được sử dụng trong khi thực thi một hàm của hợp đồng và được đại diện bởi các biến memory. Vì các giá trị đó không được lưu trữ vĩnh viễn trên chuỗi khối nên chúng không tốn nhiều tài nguyên khi sử dụng.

Tìm hiểu thêm về cách Máy ảo Ethereum (EVM) lưu trữ dữ liệu (Storage, Memory và Stack) trong tài liệu Solidity (opens in a new tab).

Các biến môi trường

Bên cạnh những biến mà bạn định nghĩa trong hợp đồng của bạn, có một số biến toàn cục đặc biệt. Chúng được sử dụng chủ yếu để cung cấp thông tin về chuỗi khối hoặc giao dịch hiện tại.

Ví dụ:

Thuộc tínhBiến trạng tháiMô tả
block.timestampuint256Khối epoch timestamp hiện tại
msg.senderđịa chỉNgười gửi thông điệp (cuộc gọi hiện tại)

Các hàm

Nói một cách đơn giản, các hàm được dùng để lấy thông tin hoặc thiết lập thông tin để phản hồi các giao dịch đến.

Có hai loại lời gọi hàm:

  • internal – các hàm này không tạo lệnh gọi EVM
    • Các hàm nội bộ và biến trạng thái chỉ có thể được truy cập nội bộ (tức là từ bên trong hợp đồng hiện tại hoặc các hợp đồng kế thừa từ nó)
  • external – các hàm này tạo lệnh gọi EVM
    • Các hàm external là một phần của giao diện hợp đồng, điều này có nghĩa là các hàm này có thể được gọi từ các hợp đồng khác và qua các giao dịch. Một hàm bên ngoài f không thể được gọi nội bộ (tức là f() không hoạt động, nhưng this.f() thì hoạt động).

Chúng cũng có thể là public hoặc private

  • Các hàm public có thể được gọi nội bộ từ bên trong hợp đồng hoặc bên ngoài thông qua các thông điệp
  • Các hàm private chỉ hiển thị đối với hợp đồng mà chúng được định nghĩa và không hiển thị trong các hợp đồng phái sinh

Tất cả các hàm và các biến trạng thái đều có thể được khởi tạo là public hoặc private

Dưới đây là một hàm có chức năng cập nhật một biến trạng thái cho một hợp đồng:

// Ví dụ về Solidity
function update_name(string value) public {
    dapp_name = value;
}
  • Tham số value của loại string được chuyển vào hàm: update_name
  • Hàm được khai báo là public, nghĩa là bất kỳ ai cũng có thể truy cập
  • Hàm không được khai báo view nên có thể sửa đổi trạng thái hợp đồng

Các hàm View

Các hàm này không được phép chỉnh sửa trạng thái dữ liệu của hợp đồng. Ví dụ phổ biến là hàm "getter" - bạn có thể sử dụng hàm này để lấy thông tin số dư của người dùng chẳng hạn.

// Ví dụ về Solidity
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

Những điều được coi là thay đổi trạng thái hợp đồng:

  1. Ghi vào các biến trạng thái.
  2. Phát sự kiện (opens in a new tab).
  3. Tạo các hợp đồng khác (opens in a new tab).
  4. Sử dụng selfdestruct.
  5. Gửi Ethers qua các lời gọi.
  6. Gọi bất kỳ hàm nào không được đánh dấu là view hoặc pure.
  7. Sử dụng các lời gọi cấp thấp.
  8. Sử dụng mã assembly nội dòng có chứa các mã vận hành nhất định.

Các hàm constructor

Các hàm constructor chỉ được thực thi một lần khi hợp đồng được triển khai lần đầu tiên. Giống như constructor trong nhiều ngôn ngữ lập trình dựa trên lớp, các hàm này thường khởi tạo các biến trạng thái theo các giá trị được chỉ định của chúng.

# Ví dụ về Vyper

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Các hàm dựng sẵn

Ngoài các biến và các hàm bạn định nghĩa trong hợp đồng của bạn, còn có một số hàm tích hợp đặc biệt. Ví dụ rõ ràng nhất là:

  • address.send() – Solidity
  • send(address) – Vyper

Hai hàm trên cho phép những hợp đồng gửi ETH đến các tài khoản khác.

Viết hàm

Hàm của bạn cần:

  • biến tham số và kiểu dữ liệu của nó (nếu hàm đó cho phép truyền các tham số)
  • khai báo internal/external
  • khai báo pure/view/payable
  • kiểu dữ liệu trả về (nếu hàm đó trả về một giá trị)

Một hợp đồng hoàn chỉnh có thể trông giống như trên. Ở đây, hàm constructor cung cấp một giá trị ban đầu cho biến dapp_name.

Các sự kiện và nhật ký

Sự kiện cho phép hợp đồng thông minh của bạn giao tiếp với giao diện người dùng hoặc các ứng dụng đăng ký khác. Khi một giao dịch được xác thực và thêm vào một khối, các hợp đồng thông minh có thể phát ra tín hiệu và ghi lại thông tin, điều này sẽ được phần mềm phía trước xử lý và sử dụng.

Các ví dụ có chú thích

Dưới đây là một vài ví dụ được viết bằng Solidity. Nếu bạn muốn thử nghiệm với mã, bạn có thể tương tác với chúng trong Remix (opens in a new tab).

Xin chào thế giới

Token

Tài sản kỹ thuật số duy nhất

Đọc thêm

Xem thêm tài liệu của Solidity và Vyper để có cái nhìn tổng quát hơn về các hợp đồng thông minh:

Bài viết này có hữu ích không?